关于 (0.1+0.7)*10 取整的结果引出的问题 浮点精度特殊进度转化
程序员文章站
2022-04-15 11:30:01
...
1. echo intval((0.1+0.7)*10); //输出结果为 7
上边的例子可能细心都看到过,也有这样的解释:
到目前为止,可能大家都能理解,因为 float 转换 int ,精度丢失是很正常的事情。
但是简单的解释并没有满足我的好奇心,当我做了以下的例子,开始不解了:
1. 1,echo intval((0.2+0.6)*10); // 8
2. 2,echo intval((0.3+0.5)*10); // 8
3. 3,echo intval((0.4+0.4)*10); // 8
4.
5. 4,echo intval((0.1+0.8)*10); // 9
6. 5,echo intval((0.2+0.7)*10); // 9
7. 6,echo intval((0.1+0.6)*10); // 7
8. 7,echo intval((0.0+0.7)*10); // 7
9. 8,echo intval(0.8*10); // 8
10. 9,echo intval((0.1+0.2)*10); // 3
上边的例子 为什么 唯独 (int)((0.1+0.7)*10) 的结果这么特殊? 也许你可能会这样解释:
0.1+0.7 实际上等于 0.79
那么0.2+0.6,0.3+0.5 为什么不是 0.79.. 呢? 还有其他的 0.1+0.8,0.2+0.7 为什么不是0.89呢?
那么引出来最终的问题,为什么0.1 + 0.7 这么特殊
上边的例子可能细心都看到过,也有这样的解释:
到目前为止,可能大家都能理解,因为 float 转换 int ,精度丢失是很正常的事情。
但是简单的解释并没有满足我的好奇心,当我做了以下的例子,开始不解了:
1. 1,echo intval((0.2+0.6)*10); // 8
2. 2,echo intval((0.3+0.5)*10); // 8
3. 3,echo intval((0.4+0.4)*10); // 8
4.
5. 4,echo intval((0.1+0.8)*10); // 9
6. 5,echo intval((0.2+0.7)*10); // 9
7. 6,echo intval((0.1+0.6)*10); // 7
8. 7,echo intval((0.0+0.7)*10); // 7
9. 8,echo intval(0.8*10); // 8
10. 9,echo intval((0.1+0.2)*10); // 3
上边的例子 为什么 唯独 (int)((0.1+0.7)*10) 的结果这么特殊? 也许你可能会这样解释:
0.1+0.7 实际上等于 0.79
那么0.2+0.6,0.3+0.5 为什么不是 0.79.. 呢? 还有其他的 0.1+0.8,0.2+0.7 为什么不是0.89呢?
那么引出来最终的问题,为什么0.1 + 0.7 这么特殊