Me gustaría tener una variable numérica que contenga un número entero con una precisión de nanosegundos. Intenté esto:
Instant t = Instant.now(); a = BigDecimal.valueof(t.getEpochSecond() * 1e9 + t.getNano()); b = BigDecimal.valueof(t.getEpochSecond() * 1e9 + t.getNano() + 1); Tanto a como b contienen el mismo valor (por ejemplo, 1,60681511777265408E+18), la operación +1 se pierde aquí.
¿Alguna idea de cómo lidiar con esta precisión? El objetivo es mantener la marca de tiempo con precisión de nanosegundos para la columna de tiempo en InfluxDB. Entiendo que tiene algo que ver con la doble precisión ( diferencia Java BigDecimal ), pero aún no he encontrado ninguna solución que funcione.
Simplemente haga las operaciones con los métodos en BigDecimal . Y asegúrese de no usar valueOf(double) . Sin embargo, puede usar valueOf(long) .
BigDecimal a = BigDecimal.valueOf(t.getEpochSecond()) .multiply(BigDecimal.valueOf(1_000_000_000)) .add(BigDecimal.valueOf(t.getNano())); BigDecimal b = BigDecimal.valueOf(t.getEpochSecond()) .multiply(BigDecimal.valueOf(1_000_000_000)) .add(BigDecimal.valueOf(t.getNano())) .add(BigDecimal.ONE); Imprimir a y b da algo como:
1606815981554921000 1606815981554921001Si está almacenando un valor entero, ¿por qué usar un BigDecimal en lugar de un BigInteger ?
import java.time.*; import java.math.*; public class MyClass { public static void main(String args[]) { Instant t = Instant.now(); BigInteger a = BigInteger.valueOf(t.getEpochSecond() * 1_000_000_000 + t.getNano()); BigInteger b = BigInteger.valueOf(t.getEpochSecond() * 1_000_000_000 + t.getNano() + 1); System.out.println(a); // 1606816120696314000 System.out.println(b); // 1606816120696314001 } } Sin embargo, debe cambiar a los métodos matemáticos BigInteger en el año 2262, porque el argumento long comenzará a desbordarse.