Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

234
Vistas
Tipo de datos para precisión de tiempo de nanosegundos en Java

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.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

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 1606815981554921001
over 4 years ago · Santiago Trujillo Denunciar

0

Si 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.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda