无法在Python3中获得Python2的精确str(float)结果

无法在Python3中获得Python2的精确str(float)结果,python,python-2.7,python-3.6,six,Python,Python 2.7,Python 3.6,Six,我试图将一些py2代码移植到py3,我想以某种方式重现py2返回的浮点数的精确字符串表示形式,但在Python3中 e、 g 在python3中,输出是0.600000000000001,而python2中的输出是0.6,我理解为什么: 但是,对于任意值的a,我是否有办法(在python3中)忠实地再现str(a)(例如,在py2和py3中的相同行为) 我试过这个 import six a = 1.5 * 0.4 string = str(a) if six.PY3: string =

我试图将一些py2代码移植到py3,我想以某种方式重现py2返回的浮点数的精确字符串表示形式,但在Python3中

e、 g

在python3中,输出是
0.600000000000001
,而python2中的输出是
0.6
,我理解为什么:

但是,对于任意值的
a
,我是否有办法(在python3中)忠实地再现
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
的情况下,我们将得到不同的输出(
5.0
用于py2和
5
用于py3)

问题来自这样一个事实,即一些分数很容易以十进制形式表示(例如1/3=0.33333333…),有些分数不容易以二进制形式表示(例如1/3=0.01010101…)。但是如果你想得到与十进制数一致的结果,请考虑查看模块(在Python 2.7和3中可用)。你可以有这样的东西:

从十进制导入十进制
a=十进制('1.5')*十进制('0.4'))
结果=str(a)
打印(结果)

尝试
f
而不是
g
。我认为“我总是能得到12位小数,例如0.60000000000你可以用
f
格式中的
之类的东西来减少多余的零,而字符串[-1]在('0','):string=string[:-1]
(不完全是用那个代码!)。
a=1.55;打印(f'{a:.1f}')
给出
1.6
。这可能不是我想要的。是的,我当然知道如何在py2或py3中将浮点格式设置为任意精度,但我不知道如何复制py2的
str(a)
正在执行的任何操作。
import six
a = 1.5 * 0.4
string = str(a)
if six.PY3:
    string = '{:.12g}'.format(a)
print(string)
>>> a = 1.5 * 0.4
>>> print(f'{a:.1f}')
0.6