不可预知的双倍

Aha*_*med 1 java math double operation

可能重复:
.NET上的双精度问题
Double计算产生奇数结果

我知道双重价值的内部代表0.2是类似的0.199999.但是下面的代码仍然让我感到困惑.

码:

public static void main(String[] args) {
    double d= 0.3d;
    double f= 0.1d;
    System.out.println(d+f);
    System.out.println(d*f);
    System.out.println(d);
    System.out.println(f);
    System.out.println(d-f);
    System.out.println(d/f);
    System.out.println((d-f)*(d-f));
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

0.4
0.03
0.3
0.1
0.19999999999999998
2.9999999999999996
0.039999999999999994
Run Code Online (Sandbox Code Playgroud)

实际上发生了什么?加法,乘法顺利,但减法,除法不是.任何人都可以详细说明为什么加法与减法不同

Ada*_*dam 5

如果你迫切需要精确使用BigDecimal.

public static void main(String[] args) {
    BigDecimal d = BigDecimal.valueOf(0.3d);
    BigDecimal f = BigDecimal.valueOf(0.1d);
    System.out.println(d.add(f));
    System.out.println(d.multiply(f));
    System.out.println(d);
    System.out.println(f);
    System.out.println(d.subtract(f));
    System.out.println(d.divide(f));
    System.out.println((d.subtract(f)).multiply(d.subtract(f)));
}
Run Code Online (Sandbox Code Playgroud)

产量

0.4
0.03
0.3
0.1
0.2
3
0.04
Run Code Online (Sandbox Code Playgroud)

或者对你的结果进行舍入,DecimalFormat会很好地使用#符号,这意味着只在必要时显示小数

    double d = 0.3d;
    double f = 0.1d;
    DecimalFormat format = new DecimalFormat("#.##");
    System.out.println(format.format(d + f));
    System.out.println(format.format(d * f));
    System.out.println(format.format(d));
    System.out.println(format.format(f));
    System.out.println(format.format(d - f));
    System.out.println(format.format(d / f));
    System.out.println(format.format((d - f) * (d - f)));
Run Code Online (Sandbox Code Playgroud)

产量

0.4
0.03
0.3
0.1
0.2
3
0.04
Run Code Online (Sandbox Code Playgroud)