我正在尝试使用金融应用,其中信用卡和借记卡的总和为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
}
}
虽然很奇怪..
答案 0 :(得分:4)
浮点数不是基础值的精确表示。这只是浮点数如何以二进制编码的事实。
有关详细信息,请查看wikipedia article。
如果您想要准确,请使用BigDecimal:
scala> BigDecimal(759500,2) - BigDecimal(854438,2) + BigDecimal(94938,2)
res1: scala.math.BigDecimal = 0.00
答案 1 :(得分:4)
这就是为什么你不应该使用浮点数学来赚钱。你有什么是舍入错误。