逗号后超过 6 位数字(纳秒)的圆形瞬间

Round instant with more than 6 digits (nanoseconds) after comma

我有带 TIMESTAMP 字段的 postgresql,它有带日期和时间的 Instant。例如:2021-10-13T15:04:24.944921Z.

如您所见,逗号 - 944921 后有 6 位数字。但是,如果我有更多数字怎么办,例如:2021-10-13T07:14:47.791616921Z。我怎样才能正确地将 Instant 舍入到 2021-10-13T07:14:47.791617Z

代码很短,但需要一些解释。你是对的,我们拥有的最好的方法是 truncatedTo 方法,它总是向下舍入。相反,我们想要 half-up 我们在学校学到的四舍五入:如果第 7 位小数等于或小于 4,则向下舍入。如果是 5 或更高,则四舍五入。

为了获得这个,我首先添加 500 纳秒。然后截断。如果小数点后第 7 位是 4 或更少,它仍然是 9 或更少,所以它之前的数字没有改变,截断将进行我们想要的向下舍入。如果第 7 位小数为 5 或更多,则添加 500 纳秒会使它溢出,第 6 位小数将增加 1,而第 7 位小数将在 0 到 4 范围内结束。然后截断将有效地对我们想要的原始值进行四舍五入。

    Instant sourceValue = Instant.parse("2021-10-13T07:14:47.791616921Z");
    Instant rounded = sourceValue.plusNanos(500).truncatedTo(ChronoUnit.MICROS);
    System.out.println(rounded);

输出是期望的:

2021-10-13T07:14:47.791617Z

让我们也试试边缘情况。

    Instant sourceValue = Instant.parse("2021-10-13T07:14:00.000000499Z");

2021-10-13T07:14:00Z

    Instant sourceValue = Instant.parse("2021-10-13T07:14:59.999999500Z");

2021-10-13T07:15:00Z