逗号后超过 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
我有带 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