int i=187;
float f=Float.MAX_VALUE;
System.out.println((f-i)==(f+i)) ;
此打印为真。为什么打印正确,如何防止精度下降?
答案 0 :(得分:2)
float
范围高端的可表示数字以2 124 的间隔隔开,大约为2.028•10 31 。执行算术运算时,结果将四舍五入到最接近的可表示值。在float.MAX_VALUE
上加上187的数学值非常接近float.MAX_VALUE
,以至于四舍五入的结果是float.MAX_VALUE
。
因此float.MAX_VALUE - 187
和float.MAX_VALUE + 187
相等。
无法通过float
或double
类型进行更改;这就是它们的设计方式。如果您想更精确地计算,还有其他解决方案,例如使用任意精度的数学软件或重新设计计算。