java - 为什么以不同的顺序将三个 double 值相乘会得到不同的答案?

标签 java double multiplication

<分区>

我正在 java 中执行以下代码,但对于数学上应该相同的数字,我得到了两个不同的答案。

public class TestClass {

    public static void main(String[] args) {
        
        double a=0.01;
        double b=4.5;
        double c=789;       
        System.out.println("Value1---->"+(a*b*c));
        System.out.println("Value2---->"+(b*c*a));      
    }
}

输出:

Value1---->35.504999999999995
Value2---->35.505

最佳答案

float 有一定的精度。有些分数不能用 float 正确显示,这就是为什么会出现舍入错误的原因。

结果因计算的优先级不同而不同。您的每个计算都包含两个乘法。 Java 中的乘法 * 运算符具有从左到右的关联性。这意味着在 (a*b*c) 中,首先计算 a*b 然后乘以 c,如 ( (a*b)*c)。其中一个计算链恰好产生舍入误差,因为其中的数字根本无法表示为 float 。

关于java - 为什么以不同的顺序将三个 double 值相乘会得到不同的答案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29122007/

相关文章:

java - 如何链接旋转动画?

java - 如何在android中解析List<Map>?

java - 使用 robots.keyPress() 后如何修复我的计算机按键配置?

java - Java中如何获取不同的组合

java - 有什么理由只为 1 个元素创建一个数组吗?

c# - 为什么 var 被解析为 Double 而不是 Long?

integer - Julia 中 2 个正数的乘积得到负数

c++ - 为什么可以打印小于 DBL_MIN 的双数?

C - 大数相乘后的错误输出

java - 使用线程将两个矩阵相乘