Java Scala对double的加法给出了不同的答案
我正在尝试金融应用程序,其中贷记和借记之和为0 为什么会这样Java Scala对double的加法给出了不同的答案,java,scala,math,Java,Scala,Math,我正在尝试金融应用程序,其中贷记和借记之和为0 为什么会这样 scala> 7595.00-8544.38+949.38 res7: Double = 7.958078640513122E-13 但是当排序和添加时 scala> 7595.00+949.38-8544.38 res8: Double = 0.0 问题是数字是随机的,但它们的总和总是等于零 我对节点做了同样的操作,发现了相同的结果。 问题是什么 我写了这个函数,它可以工作 def sum(xs: List[Doub
scala> 7595.00-8544.38+949.38
res7: Double = 7.958078640513122E-13
但是当排序和添加时
scala> 7595.00+949.38-8544.38
res8: Double = 0.0
问题是数字是随机的,但它们的总和总是等于零
我对节点做了同样的操作,发现了相同的结果。
问题是什么
我写了这个函数,它可以工作
def sum(xs: List[Double]): Double = {
xs match {
case x :: tail => BigDecimal(x + sum(tail)).setScale(2,BigDecimal.RoundingMode.HALF_UP).toDouble
case Nil => 0
}
}
但奇怪的是..浮点数并不是底层值的精确表示。这只是浮点数如何用二进制编码的一个事实 有关更多信息,请查看 如果需要精确性,请使用:
这就是为什么你不应该用浮点数学来赚钱。这里有一个舍入误差 谢谢,我更喜欢scala>BigDecimal(7595.00)-BigDecimal(8544.38)+BigDecimal(949.38),因为金额可以是一个或两个decimal@ameychavan,不要这样做,因为如果用浮点数创建BigDouble,那么可能只是创建了一个已经存在舍入错误的BigDouble。例如,
BigDecimal(1.1+2.2)
,我没有使用double,而是从inputstreamUhh中得到的字符串进行右变换,BigDecimal(8544.38)
中的8544.38
是一个双精度。。。但是,是的,从一个字符串开始就可以了。谢谢,如果您添加其他选项,这会很有帮助
scala> BigDecimal(759500,2) - BigDecimal(854438,2) + BigDecimal(94938,2)
res1: scala.math.BigDecimal = 0.00