首先明确,不是,是的结果不是10
因为,相加过程中所得到的小数,无法精确的表达成对应的二进制数。
float sum = 0; for (int i = 1; i <= 100; i++) { sum += 0.1; } System.out.println(sum);
执行结果如下
"C:Program FilesJavajdk1.8.0_73injava.exe" ... 10.000002 Process finished with exit code 0
为什么在程序中0.1累加100次结果不是10呢?
其实和计算机的进制转换有关。所有的运算都会被计算机转换成二进制进行操作。但是,有些十进制小数无法精确的转换成二进制。
例如1/3=0.333... 无限循环,不能用十进制精确表示,又怎么准确转换成二进制呢?遇到这种情况计算机会根据变量数据类型所对应得长度,将数据截断或者四舍五入。
二进制0.0000~0.1111对应的十进制罗列如下
二进制数 | 对应的十进制数 |
0.0000 | 0 |
0.0001 | 0.0625 |
0.0010 | 0.125 |
0.0011 | 0.1875 |
0.0100 | 0.25 |
0.0101 | 0.3125 |
0.0110 | 0.375 |
0.0111 | 0.4375 |
0.1000 | 0.5 |
0.1001 | 0.5625 |
0.1010 | 0.625 |
0.1011 | 0.6875 |
0.1100 | 0.75 |
0.1101 | 0.8125 |
0.1110 | 0.875 |
0.1111 | 0.9375 |