我正在尝试将一些 py2 代码移植到 py3,我想以某种方式重现 py2会返回的浮点数的确切字符串表示形式,但在 python 3 中。
例如
from __future__ import print_function
a = 1.5 * 0.4
string = str(a)
print(string)
在python3中,输出是0.6000000000000001
,而python2的输出是0.6
,我明白为什么:
为什么 str(float( 在 Python 3 中返回的数字比 Python 2 多?
但是,有没有一种方法可以我可以忠实地重现(在 python3 中(对于a
的任意值str(a)
会是什么(例如,py2 和 py3 中的相同行为(?
我试过这个
import six
a = 1.5 * 0.4
string = str(a)
if six.PY3:
string = '{:.12g}'.format(a)
print(string)
上面的"几乎"有效,但在a = 5
的情况下,我们将得到不同的输出(py2 为5.0
,py3 为5
(
问题来自这样一个事实,即与某些分数很容易以十进制形式表示的方式相同(例如 1/3 = 0.33333333...(,一些分数不容易以二进制形式表示(例如 1/3 = 0.01010101...(。但是,如果您希望获得与十进制数字一样一致的结果,请考虑查看十进制模块(在 Python 2.7 和 3 中可用(。你可以有这样的东西:
from decimal import Decimal
a = Decimal('1.5') * Decimal('0.4')
result = str(a)
print(result)
>>> a = 1.5 * 0.4
>>> print(f'{a:.1f}')
0.6