作者dio833 (Dio)
看板PHP
标题Re: [请益] 请问(int) ((0.1 + 0.7) * 10)为什麽是7
时间Fri May 18 01:16:05 2012
你把十进位改成二进位之後再转回来就可以明白了
为方便计算,我假设记忆体只能存储小数点後13位
0.1 = 0.0001100110011 (0.0之後的0011为无限循环,超出记忆体范围者被截掉)
0.7 = 0.1011001100110 (0.1011之後的0011为无限循环...)
相加和 = 0.1100110011001
由上述再反转回10进位,过程如下
0.5
0.25 (0.75)
0.03125 (0.78125)
0.015625 (0.796875)
0.001953125 (0.798828125)
0.0009765625 (0.7998046875)
+ 0.0001220703125 (0.7999267578125)
-------------------------
0.7999267578125
由右方可以观察到,计算位数愈多,愈逼近某个数
而0.8转成二进位应该是什麽呢?下面我拿0.8的二进位跟计算出来的13位比较一下
相加和 = 0.1100110011001
0.8 = 0.11001100110011001100....(无穷无尽的0011)
因此可以看出,计算位数如果愈多,愈逼近0.8的二进位
精确度取决於记忆体中存放的位数,但无论如何就是到不了0.8了
除非能保证使用的十进位小数可以转换成二进位的有限小数
不然就算记忆体存放的位数再大,都会丧失一部分的精确度
这就是浮点数运算的弊端
※ 引述《BloodyDawn (血色曙光)》之铭言:
: 大家好~今天看书上写了这个范例让我满纳闷的
: PHP Code :
: echo (int) ((0.1 + 0.7) * 10);
: 正常情况下看到应该会印出8,但书上写的答案是7
: 我也用http://writecodeonline.com/php/这个网站试了一下确实是印出7
: 书上的说法是在这边最後计算的结果是7.999999再转换成8
: 但遇到将型态转成整数就会变成了7
: 那这边有两个问题:
: 1.我把0.7换成0.1~0.9但就只有0.7会有这个问题,请问是为什麽呢?
: 2.为什麽在这里的计算结果会变成了7.999999呢?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.34.13.174
※ 编辑: dio833 来自: 114.34.13.174 (05/18 01:17)
1F:推 kusoayan:推 05/18 01:56
2F:推 eye2468:长知识~推~ 05/18 10:08
3F:推 kerash:push 05/18 10:20
4F:推 BloodyDawn:原来如此,非常感谢:D 05/19 14:31
5F:推 tyh11:Good...(Y) 05/19 15:56
6F:推 Bambe:长知识~! 推! 05/19 22:39