Python 楼层划分//vs int()四舍五入
我是Python 3.6.0的新用户。我试着将两个数字相除,得到一个大的输出。然而,使用Python 楼层划分//vs int()四舍五入,python,floating-point,int,rounding,floor-division,Python,Floating Point,Int,Rounding,Floor Division,我是Python 3.6.0的新用户。我试着将两个数字相除,得到一个大的输出。然而,使用 return ans1 // ans2 使用时产生55347740058143507128 return int(ans1 / ans2) 生产55347740058143506432 哪个更准确?为什么如此?从这个意义上讲,地板整数分割更准确 这种构造int(ans1/ans2)的问题是,结果暂时是一个浮点(显然,在将其转换为整数之前),将舍入引入最近的浮点(舍入量取决于数字的大小)。这甚至可以通过尝
return ans1 // ans2
使用时产生55347740058143507128
return int(ans1 / ans2)
生产55347740058143506432
哪个更准确?为什么如此?从这个意义上讲,地板整数分割更准确 这种构造
int(ans1/ans2)
的问题是,结果暂时是一个浮点(显然,在将其转换为整数之前),将舍入引入最近的浮点(舍入量取决于数字的大小)。这甚至可以通过尝试通过浮点对该值进行往返来看出:
print(int(float(55347740058143507128)))
它打印
55347740058143506432
。因此,因为普通的/
会产生一个浮点,这限制了它的精度。第一个更精确,因为它给出了精确的整数结果
第二个将中间结果表示为浮点。浮点的分辨率有限(),而结果需要66位才能准确表示。这会导致精度下降
如果我们查看两个结果的十六进制表示:
>>> hex(55347740058143507128)
'0x3001aac56864d42b8L'
>>> hex(55347740058143506432)
'0x3001aac56864d4000L'
我们可以看到,结果中不符合53位尾数的最低有效位都被设置为零
直接查看舍入的一种方法是,不因除法而带来任何复杂情况:
>>> int(float(55347740058143507128))
55347740058143506432L
您需要指定您正在使用的语言。@zneak-Oh谢谢。我是个笨蛋,是的!没问题。您能否澄清您正在使用的Python版本?最后,能否运行
repr(ans1)
和repr(ans2)
并发布结果?@zneak Ok。我使用的是3.6.0。我已将repr(ans1)打印为451590670066711754345182435986161482679531303945971812637081600000000,将repr(ans2)打印为8159152832478973434561126959611589272000000。欢迎使用stackoverflow。请看地图。下次,一定要用语言标记你的问题——大多数人都会用标记来寻找问题,所以大多数听众不会看到这个问题。