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

Not able get exact str(float) result of python 2 in python 3

我正在尝试将一些 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,我明白为什么:

Why does str(float) return more digits in Python 3 than Python 2?

但是,有没有一种方法可以让我忠实地重现(在 python3 中)str(a) 会是什么(例如 py2 中的相同行为和 py3),对于 a 的任意值?

我试过了

import six
a = 1.5 * 0.4
string = str(a)
if six.PY3:
    string = '{:.12g}'.format(a)
print(string)

上面的 "almost" 有效,但在 a = 5 的情况下,我们将得到不同的输出(5.0 用于 py2,5 用于 py3)

>>> a = 1.5 * 0.4
>>> print(f'{a:.1f}')
0.6

问题是因为有些分数很容易用十进制表示(例如1/3 = 0.33333333…),有些分数不容易用二进制表示(例如1/ 3 = 0.01010101……)。但是,如果您希望获得与十进制数一样一致的结果,请考虑查看 decimal 模块(在 Python 2.7 和 3 中可用)。你可以有这样的东西:

from decimal import Decimal

a = Decimal('1.5') * Decimal('0.4')
result = str(a)
print(result)