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

wswtfjt7  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(326)

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

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

两者 a 以及 b 如果包含相同的值(例如1.60681511777265408e+18),+1操作在此丢失。
你知道如何处理这种精确性吗?它的目标是保持XDB中时间列的纳秒精度时间戳。我知道这与双精度(javabigdecimal difference)有关,但我还没有找到任何有效的解决方案。

7ajki6be

7ajki6be1#

只需使用中的方法进行操作 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);

印刷 a 以及 b 给出如下信息:

1606815981554921000
1606815981554921001
mbskvtky

mbskvtky2#

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

需要切换到 BigInteger 但是2262年的数学方法,因为 long 参数将开始溢出。

相关问题