【发布时间】:2016-08-27 15:37:33
【问题描述】:
我正在将 MATLAB 代码移植到 Python 3.5.1,但发现了浮点舍入问题。
在 MATLAB 中,以下数字会向上四舍五入到小数点后第 6 位:
fprintf(1,'%f', -67.6640625);
-67.664063
另一方面,在 Python 中,以下数字会关闭到小数点后 6 位:
print('%f' % -67.6640625)
-67.664062
有趣的是,如果数字是 '-67.6000625',那么即使在 Python 中它也会向上四舍五入:
print('%f' % -67.6000625)
-67.600063
... 为什么会这样? 在 Python 中舍入/向上的标准是什么? (我相信这与处理十六进制值有关。)
更重要的是,如何防止这种差异? 我应该创建一个 python 代码,它可以重现与 MATLAB 产生的完全相同的输出。
【问题讨论】:
-
我很好奇,所以我也在 numpy 中查找了 this 的行为。我得到的很奇怪。
np.around(a,6)(a 是您的第一个值)产生 -67.664062000000001。您尝试的第二个值产生:-67.600061999999994。 The official python documentation 解释了这种行为。 -
我尝试了C和Octave,它们都打印
-67.664062,和Python一样。 -
考虑到浮点比较一直是多么棘手(比如 3.0*2.2 != 2.0*3.3),我首先要质疑该项目的可行性。比较两个浮点数的最佳做法始终是将差异与某个容差进行比较。
-
我建议不要使用隐式的舍入形式。相反,请确保您的代码正在执行您期望的操作。 This answer 是对你想做的事情的一个很好的总结。