2
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

4

3 回答 3

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
于 2013-07-24T11:43:50.067 回答
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 6我们Line 7在那里乘以它extended的小数点。
Line 2&Line 8我们做addition,你知道addition永远不会扩展它的小数点来显示最大的小数点。

于 2013-07-24T12:00:36.683 回答
1

因为某些浮点数不能在不四舍五入的情况下用有限的位数表示。 浮点数的位数有限,它们不能准确地表示所有实数:当位数超过格式允许的位数时,剩余的将被省略 - 数字被四舍五入。

您可能应该阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic这个答案

我不明白为什么分解形式返回 1.49499 而开发形式返回我想要的:1.495。

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

于 2013-07-24T11:38:20.833 回答