需要把一段java代码重写为python的,运行结果总是不对,调试后发现是python在计算过程中和java有些不一样。
比如计算下面这个数字:
1811552740395741107/62
java和win10系统计算器计算的结果都是 【29218592587028082】
但是,python计算的结果是-------------【29218592587028084】
为什么会相差2?
很难受,是什么原因导致的这种情况,python在这其中是有一些坑是我不知道的吗?
#更新
在stackOverflow上找到了解决办法,用运算符'//'代替'/'。
1811552740395741107 // 62
'//'表示整数除法,结果是整数?程序结果是正确了,但是不知道为什么,之前的结果相差2,也不是进位退位导致的吧。
不知道python的'/'底层是怎么实现的,大数运算过程中二进制位产生了累积误差?
还发现一个问题,绝对值函数math.fabs(),下列代码:
t = -1811552740395741107
if -t == math.fabs(t):
print(-t)
print('%f' % math.fabs(t))
两条print是可以执行的,但是输出结果是:
1811552740395741107
1811552740395741184.000000
也就是说在内存中的二进制数是相等的,但是打印出两个数却不一样?
如果拿fabs()得到的结果去计算,程序和预期的结果又不一样,很烦,今天踩了很多坑!
有谁知道其中的原因么,为什么Python的行为和其他语言不一样?这应该不是BUG吧