- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在 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
立即舍入传递给 apply
的 Double
,这样结果 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/
这个问题已经有答案了: Is floating point math broken? (33 个回答) 已关闭 5 年前。 所以我有这个代码 public String getRounded(doub
我正在使用带有 HALF_UP 舍入模式的 DecimalFormat,但我有一个无法正常工作的场景,我不知道为什么。 DecimalFormat df = new DecimalFormat("#.
我想将 BigDecimal 值四舍五入到最接近的整数。 我尝试使用此问题的解决方案 Java BigDecimal: Round to the nearest whole value ,但这对我不起
我正在尝试使用 scale=3 和 HALF_UP 舍入模式对 0.14049 进行舍入,并希望看到舍入值 = 0.141 但得到的是 0.140。 根据我的理解,最后一个十进制数字 9 应该将 4
以下代码: double doubleValue = 1713.6; float floatValue = 1713.6f; String fs = "%-9s : %-7s %-7s\n"; Sys
请随意评论我。下面的程序出了什么问题。它给出了不同的回合结果。 public class Test { public static String round(double value, int
据我了解,RoundingMode.HALF_UP 使用我们传统的舍入方式。但是,它没有给我想要的结果: 我正在使用具有不同参数(#、#.#、...等)的 DecimalFormat() 并输入 do
我们有以下代码: BigDecimal net = price .divide(taxCumulative, RoundingMode.HALF_UP) .setScale(2, BigDecimal
我知道这个话题已经被广泛讨论了。但当我阅读 BigDecimal 主题的答案时,我感到困惑。我希望你不要因为我开始这个话题而生气。 我正在创建一个程序来对几个数字进行非常简单的除法。我有两个代表金额的
这个问题在这里已经有了答案: How to round 0.745 to 0.75 using BigDecimal.ROUND_HALF_UP? (6 个答案) 关闭 5 年前。 我正在从 0.4
以下: new MathContext(precision, RoundingMode.HALF_UP); 似乎有效。但是,以下返回错误: new MathContext(precision, Big
在 scala 中,我尝试使用 HALF_UP 舍入模式将以下数字舍入为小数点后 3 位精度。8409.3555 不幸的是,scala 返回 8409.356,但 Java 返回 8409.355 S
RoundingMode 允许程序员指定 float 的舍入方式。这一切都很棒,但我发现其中有一件事很奇怪。也许我只是误解了学校的一些基本知识。 但是这个舍入模式被描述为我在学校教的那个,“总是四舍五
我是一名优秀的程序员,十分优秀!