无法在 python 3 中获取 python 2 的确切 str(float) 结果



我正在尝试将一些 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

相关内容

  • 没有找到相关文章

最新更新