Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Scala对double的加法给出了不同的答案_Java_Scala_Math - Fatal编程技术网

Java Scala对double的加法给出了不同的答案

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

我正在尝试金融应用程序,其中贷记和借记之和为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
    } 
}

但奇怪的是..

浮点数并不是底层值的精确表示。这只是浮点数如何用二进制编码的一个事实

有关更多信息,请查看

如果需要精确性,请使用:


这就是为什么你不应该用浮点数学来赚钱。这里有一个舍入误差

谢谢,我更喜欢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