在java中设置double = 0.1,然后打印出来,仍然是0.1.但是按照2进制浮点数的表示法,应该是不能精确表示0.1的,只能精确表示类似0.5,0.25这样的数.我想知道JAVA是怎么能够在某些情况下精确表示浮点数的.再举个例子,0.4/4=0.1,而0.4-0.3=0.10000000000000003.
1 回答
暮色呼如
TA贡献1853条经验 获得超9个赞
恰好自己有过一点研究。
首先可以肯定,出现这种现象的原因并不是发生在二进制数的表示阶段,0.1确实无法用二进制浮点数精确表示,这个毋庸置疑。
之所以会出现本不能精确表示的浮点数在打印出来后反而是精确的,是因为在将其转换为字符串的过程中,Java耍了点小聪明。它会将看起来疑似是“整”的浮点数进行特殊处理,转换为那个“整”的十进制小数形式。
举个例子,比如0.1,如果按内部表示直接转换过来可能应该是0.1000...0011,这种情况下,最后两位的数值太小,Java就会认为是精度不够而产生的,于是转成字符串的时候会将其转为0.1。
而0.4/4和0.4-0.3,由于参与计算的时候,都至少有一个是不能精确表示的数,所以结果可能会有一定的误差。按照前面的例子,可能0.4/4的结果为0.1000...0010,最后一位与真正的0.1不同,而0.4-0.3的结果为0.1000...0300,这个误差就比较大了。
注:以上仅仅是我臆想的值,并不是真实的数据。能够说明问题即可。
由于两者误差不同,所以0.4/4的结果仍然会被认为是“整”的小数0.1,但0.4-0.3却由于累计的误差较大而被认为不是0.1,而是原样转换为0.1000...03。
添加回答
举报
0/150
提交
取消