Expended和Factored计算之间的结果不同

时间:2013-07-24 11:28:45

标签: java math

public class TestMain {

    public static void main(String[] args) {
        Double value = 1.25 * ((19.6 / 100) + 1);
        System.out.println(value);
        Double value2 = (1.25 * (19.6 / 100)) + (1 * 1.25);
        System.out.println(value2);
    }
}

结果是:

1.4949999999999999
1.495

我不明白为什么这些不同......

我添加了明确的括号来测试不同的情况,我不明白为什么Factored表单返回1.49499developed表单返回我想要的内容:1.495

3 个答案:

答案 0 :(得分:2)

如果您需要具有浮点的精确结果,则可以使用BigDecimal类。

BigDecimal factor = new BigDecimal(19.6);
BigDecimal multiplier =  new BigDecimal(1.25);
BigDecimal oneHundred = new BigDecimal(100);
BigDecimal one = new BigDecimal(1);

BigDecimal res = multiplier.multiply(factor.divide(oneHundred).add(one));
System.out.println(res);

BigDecimal res2 = multiplier.multiply(factor.divide(oneHundred)).add(one.multiply(multiplier));
System.out.println(res2);

结果:

1.495000000000000017763568394002504646778106689453125
1.495000000000000017763568394002504646778106689453125

答案 1 :(得分:1)

因为某些浮点数不能用有限数量的位表示而不能舍入。 Floating-point numbers的数字位数有限,它们不能准确地代表所有real numbers:当数字多于格式允许的数字时,剩余的数字将被省略 - 数字是四舍五入的。

您应该阅读What Every Computer Scientist Should Know About Floating-Point Arithmeticthis answer

  

我不明白为什么这个因式表格返回1.49499并且开发的表单返回我想要的内容:1.495。

我不确定具体原因,但在第一种情况下,间歇性结果似乎是四舍五入的。

答案 2 :(得分:1)

基本概念
1.当我们addition两个decimal数时,它的小数点永远不会extends 2.当我们multiplication两个decimal数字时,它将extends小数点作为要求。

了解概念Java代码

public static void main(String[] args) {
        Double v1 = (19.6/100);
        System.out.println("inti v1 = "+v1);
        v1 += 1; 
        System.out.println("1 + v1 = "+v1);
        v1 *= 1.25;
        System.out.println("Ans = 1.25 * v1 = "+v1);
        Double v2 = (19.6 / 100);
        Double v3 = (double) 1;
        System.out.println(" inti v2 = "+v2);
        System.out.println("inti v3 = "+v3);
        v2 *= 1.25;
        v3 *= 1.25;
        System.out.println("1.25 * v2 = "+v2);
        System.out.println("1.25 * v3 = "+v3);
        Double v4 = v2+v3;
        System.out.println("Ans v2 + v3 = v4 = "+v4);
    }}

<强>输出

 1. inti v1 = 0.196
 2. 1 + v1 = 1.196
 3. Ans = 1.25 * v1 = 1.4949999999999999

 4. inti v2 = 0.196
 5. inti v3 = 1.0
 6. 1.25 * v2 = 0.245
 7. 1.25 * v3 = 1.25
 8. Ans v2 + v3 = v4 = 1.495

在输出中显示行号以便于理解概念。

这不是一个不同的程序,而是在您的代码中逐个跟踪+ / *数学的过程。

你可以在输出中看到,
Line 3Line 6Line 7我们在那里乘以extended小数点。
并在Line 2&amp; Line 8我们addition addition,如您所知{{1}}永远不会延长其小数点获得最大小数点来显示。