可能的重复:
.NET 上的双精度问题 https://stackoverflow.com/questions/566958/double-precision-problems-on-net
双重计算产生奇数结果 https://stackoverflow.com/questions/8253789/double-calculation-producing-odd-result
我知道双精度值的内部表示0.2
是这样的0.199999
。但下面的代码仍然让我困惑。
CODE:
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));
}
OUTPUT:
0.4
0.03
0.3
0.1
0.19999999999999998
2.9999999999999996
0.039999999999999994
究竟发生了什么?加法、乘法可以进行,但减法、除法则不行。谁能详细说明一下为什么加法与减法的效果不同 ?
如果您迫切需要精度,请使用 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)));
}
Output
0.4
0.03
0.3
0.1
0.2
3
0.04
或者对结果进行四舍五入,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)));
Output
0.4
0.03
0.3
0.1
0.2
3
0.04
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)