gpt4 book ai didi

java - Scala 和 Java 中的 RoundingMode.HALF_UP 区别

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:12:22 25 4
gpt4 key购买 nike

在 scala 中,我尝试使用 HALF_UP 舍入模式将以下数字舍入为小数点后 3 位精度。8409.3555

不幸的是,scala 返回 8409.356,但 Java 返回 8409.355

Scala 代码:

def round(d: Double): Double = {
BigDecimal.apply(d).setScale(3, RoundingMode.HALF_UP).doubleValue()
}

Java代码:

private static Double round(Double d) {
BigDecimal bd = new BigDecimal(d);
bd = bd.setScale(3, RoundingMode.HALF_UP);
return bd.doubleValue();
}

有什么已知问题吗?

最佳答案

通常,您不希望直接将文字 double 转换为 BigDecimal,因为您可能会遇到浮点舍入错误。 scaladoc 中也有警告:

When creating a BigDecimal from a Double or Float, care must be taken as the binary fraction representation of Double and Float does not easily convert into a decimal representation

我们可以在 java.math.BigDecimal 中看到它的发生:

scala> new java.math.BigDecimal(8409.3555)
res1: java.math.BigDecimal = 8409.355499999999665305949747562408447265625

当您尝试将该数字(一半)四舍五入时,它现在是 8409.355。 scala.math.BigDecimal.apply 使用 MathContext 立即舍入传递给 applyDouble,这样结果 BigDecimal 与您传入的文字 Double 具有相同值的机会增加。在第一个片段中,真正 被调用的是:

scala> scala.math.BigDecimal(8409.3555)(java.math.MathContext.DECIMAL128)
res10: scala.math.BigDecimal = 8409.3555

最好将这些文字表示为字符串,以避免存储 Double 时出现任何舍入错误。例如:

scala> scala.math.BigDecimal("8409.3555")
res17: scala.math.BigDecimal = 8409.3555

scala> new java.math.BigDecimal("8409.3555")
res18: java.math.BigDecimal = 8409.3555

如果您必须Double 转换,我建议您使用scala.math.BigDecimal.apply 进行转换。

关于java - Scala 和 Java 中的 RoundingMode.HALF_UP 区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42396509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com