斯卡拉加双给出了不同的答案

时间:2014-08-01 07:21:28

标签: 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[Double]): Double = {
    xs match {
      case x :: tail => BigDecimal(x +  sum(tail)).setScale(2,BigDecimal.RoundingMode.HALF_UP).toDouble 
      case Nil => 0
    } 
}

虽然很奇怪..

2 个答案:

答案 0 :(得分:4)

浮点数不是基础值的精确表示。这只是浮点数如何以二进制编码的事实。

有关详细信息,请查看wikipedia article

如果您想要准确,请使用BigDecimal

 scala> BigDecimal(759500,2) - BigDecimal(854438,2) + BigDecimal(94938,2)
 res1: scala.math.BigDecimal = 0.00

答案 1 :(得分:4)

这就是为什么你不应该使用浮点数学来赚钱。你有什么是舍入错误。