返回信息流用python刷题遇到个除法问题..就是用整数除以一个小数时,有时本应该整除的结果没有整除
例如:
>>> 17/0.17
99.99999999999999
>>>
然后int()转换以后就直接变成99了
其他还有:
>>> 173/0.173
1000.0000000000001
>>> 1730/1.73
1000.0
>>> 14/0.14
99.99999999999999
用C在173/0.173时也不是整除,但换double时小数又变全0了,不知道是什么原因呢...和精度有关?
这是一条镜像帖。来源:北邮人论坛 / python / #16015同步于 2016/9/16
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖
[问题]关于Python除法的问题
WindSword
2016/9/16镜像同步14 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
按理说都是小于实际结果,为毛这个最后出来个1
>>> 173/0.173
1000.0000000000001
【 在 novagforce 的大作中提到: 】
: IEEE 754标准的浮点数永远都不是精确的。cast到int肯定会截断小数部分,用round(17/0.17, 0)才能得到正确结果。
【 在 novagforce 的大作中提到: 】
: IEEE 754标准的浮点数永远都不是精确的。cast到int肯定会截断小数部分,用round(17/0.17, 0)才能得到正确结果。
确切地说,IEEE 754浮点数并不能精确地表示所有的数。double型能表示的是52位二进制浮点小数。凡是它能表示的数,都是精确的。比如1, 0.5, 0.25, 0.75都能精确表示。但0.17不可以精确地表示。
【 在 forienlauo 的大作中提到: 】
: 按理说都是小于实际结果,为毛这个最后出来个1
: >>> 173/0.173
: 1000.0000000000001
: ...................
不一定。IEEE754不能表示所有的数。如果某个数不能表示(比如十进制小数0.173),转换的时候一般按“舍入到最接近的能表示的数”的方法转换,这就使得转换后,有可能比想要的数还要大,也可能比想要的数小。而且,这是除法运算。除数小了,结果大,并不奇怪。
这样的话..想得到正确结果,只能自己设定一个精度,然后把再结果四舍五入了么..
【 在 nuanyangyang 的大作中提到: 】
: 不一定。IEEE754不能表示所有的数。如果某个数不能表示(比如十进制小数0.173),转换的时候一般按“舍入到最接近的能表示的数”的方法转换,这就使得转换后,有可能比想要的数还要大,也可能比想要的数小。而且,这是除法运算。除数小了,结果大,并不奇怪。
【 在 WindSword 的大作中提到: 】
: 这样的话..想得到正确结果,只能自己设定一个精度,然后把再结果四舍五入了么..
:
看你怎么定义“正确”了。如果做图像处理,尤其是游戏的话,在快速变化的画面面前,每个像素的颜色有那么一点点不正确,人是看不出来的,所以这种应用对精度要求非常低。这也是为什么显卡的GPU更擅长处理单精度浮点数而不是双精度。
但是,科学计算的话,就要看具体的精度要求了。
最严格的应该是涉及钱的计算了。这种应用一般要求一点点都不能错。用IEEE754浮点数来表示钱的数额,是个很馊的主意。这种情况下可以用高精度整数、小数的库来做。比如这个python-money库:https://github.com/carlospalol/money
【 在 WindSword 的大作中提到: 】
: 这样的话..想得到正确结果,只能自己设定一个精度,然后把再结果四舍五入了么..
:
还有标准库里的decimal模块:高精度十进制小数:https://docs.python.org/3/library/decimal.html
懂了懂了,是0.173变小了,,,第一次被nuanyangyang宠幸好激动
【 在 nuanyangyang 的大作中提到: 】
: 不一定。IEEE754不能表示所有的数。如果某个数不能表示(比如十进制小数0.173),转换的时候一般按“舍入到最接近的能表示的数”的方法转换,这就使得转换后,有可能比想要的数还要大,也可能比想要的数小。而且,这是除法运算。除数小了,结果大,并不奇怪。