Java中纳秒时间精度的数据类型



我想要一个包含纳秒精度整数的数字变量。我试过这个:

Instant t = Instant.now();
a = BigDecimal.valueof(t.getEpochSecond() * 1e9 + t.getNano());
b = BigDecimal.valueof(t.getEpochSecond() * 1e9 + t.getNano() + 1);

ab都包含相同的值(例如1.60681511777265408E+18(,+1操作在此丢失。

知道如何处理这种精度吗?它的目标是在InfluxDB中为时间列保留纳秒精度的时间戳。我知道这与双精度(Java BigDecimal的差异(有关,但我还没有找到任何有效的解决方案。

如果要存储整数值,为什么要使用BigDecimal而不是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
}
}

不过,需要在2262年切换到BigInteger数学方法,因为long参数将开始溢出。

只需使用BigDecimal中的方法进行操作。并确保您不使用valueOf(double)。但是,您可以使用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);

打印ab会给出类似的结果:

1606815981554921000
1606815981554921001

最新更新