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