【发布时间】:2021-03-13 05:29:31
【问题描述】:
我想要一个包含纳秒精度整数的数值变量。我试过这个:
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 操作在这里丢失。
知道如何处理这种精度吗?它的目标是为 InfluxDB 中的时间列保留纳秒精度的时间戳。我知道它与双精度有关 (Java BigDecimal difference),但我还没有找到任何可行的解决方案。
【问题讨论】:
-
一个问题是 1e9 是一个
double。这意味着valueOf的参数表达式是以浮点数计算的......并且您正在失去精度。 -
另外值得注意的是,纳秒时钟可能没有纳秒精度。事实上,答案中显示的输出暗示您可能会得到微秒精度。
-
为什么要使用数字类型?
Instant已经具有纳秒精度。它不是给你想要的一切吗? -
@OleV.V.
Instant每秒保存纳秒,但不能给你一个值,我需要在 InfluxDB 中为值加上时间戳。 -
感谢您的回答。说得通。如果是我,如果 InfluxDB 有
timestamp with time zone类型,我会使用它,否则将Instant转换为字符串并存储为char或varchar以提高可读性。
标签: java time types type-conversion time-precision