a=0.6
b=6/10
c=0.3+0.3
d=6*0.1
结果d>a=b=c
这么看乘法最特殊也最不精确 虽然乘法精确性不那么高,但是它算的快啊,要不然图形库里也不至于总是直接乘倒数了。 kara2000 发表于 2022-5-5 09:42
接着用就是了,你又不造火箭在乎这点误差?或者你学python是为了输出数值龟龟整整的好看? ...
造火箭也不会在乎这点误差,不少老代码还是用的单精度浮点数呢 本帖最后由 Tring 于 2022-5-5 17:35 编辑
诶哟卧草 发表于 2022-5-5 12:45
其实我觉得4.9999999 还是5还是5.0000001也无所谓了,目前我还没有计算机思维感觉这几个数都一样。
但我最 ...
因为有问题的是0.1 。
1/10也就是十进制的0.1,在二进制下是一个无限循环小数(因为含有因数5),并不能用有限位表示。
这么说或许不太直观,换成十进制的例子,你可以理解为1/3:
1/3在十进制里有限位表示为0.33333
1.8 * 0.33333 = 0.599994
1.8 / 3 = 0.6
乘以0.1在二进制里也是一样的情况。
事实上任何一个在分母中含有非2质因数的最简分数,在二进制下都无法用有限位精确表示,
所以二进制浮点型其实是个巨坑爹的玩意。
本帖最后由 EraserKing 于 2022-5-5 18:44 编辑
2022年了还有人在踩这个坑 IEEE 754标准罪大恶极啊
基本原理楼上有人都说过了,不要钻这个牛角尖,不能表示为“非2的整数次幂分之一的小数之和”的小数是没有办法精确地以二进制浮点数储存的
你随便一搜“Python 小数 精度”不就有官方解答了吗?
https://docs.python.org/zh-cn/3/tutorial/floatingpoint.html
你看到的0.7也不是精确的0.7,只是保留17位精度之下“显示为0.7”而已
BTW:就算是整数,以浮点数存储的时候也有精度问题:先给你打个预防针
>>> 12345678901234567.0 == 12345678901234568.0
True
>>> 1234567890123456.0 == 1234567890123457.0
False
页:
1
[2]