Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

233
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda