简单地说,我有科学计数法4.534524725984957e+16,我试图得到抑制。这里正确的数字是45345247259849570 ...但是python总是返回错误的数字,比如45345247259849568 ...有什么想法吗?
mf98qq941#
浮点字面值给予float类型实际提供的精度更高。Python会尽最大努力将这样的字面值Map到接近您想要的值。
float
>>> float(45345247259849570) 4.534524725984957e+16 >>> float(45345247259849568) 4.534524725984957e+16 >>> float(45345247259849570) == float(45345247259849568) True >>> float(45345247259849570) == 4.534524725984957e+16 True
iklwldmw2#
回想一下,Python float本质上是一个C double,它以 * 二进制 * 科学记数法存储。在二进制中,56位整数45345247259849570表示为1010000100011001010000110001101100110011001111001101100010。或者在科学记数法中,1.010000100011001000011000110110011001100111001101100010× 255。(为了便于比较,我将最低有效数字加粗。)问题是,只有53位有效数字可以存储。所以你的数字被舍入为1.0100001000110010001100011001100110011001100111001101100× 255,即十进制的45345247259849568。如果您不愿意接受这种舍入误差,解决方案是使用适当的数据类型来存储您的数字。内置的int(或者long,如果你还在使用Python 2.x)可以精确地存储任何可以容纳在进程内存中的整数(整数)。当然,如果你在小数点右边有数字,它就不起作用了。decimal.Decimal是一个浮点类型,默认情况下存储28位十进制数字。它非常适合财务计算,其中“$0.01”表示1美元的1/100,而不是0.0100000000000000020816681711721685132943093776702880859375。
double
int
long
decimal.Decimal
>>> from decimal import Decimal >>> Decimal('4.534524725984957e+16') Decimal('4.534524725984957E+16')
然而,像1/3这样的非十进制分数仍然只是近似的。
>>> Decimal(1) / Decimal(3) Decimal('0.3333333333333333333333333333') >>> _ * 3 Decimal('0.9999999999999999999999999999')
fractions.Fraction将精确地存储任何有理数作为分子/分母对。
fractions.Fraction
>>> from fractions import Fraction >>> Fraction('4.534524725984957e+16') Fraction(45345247259849570, 1)
2条答案
按热度按时间mf98qq941#
浮点字面值给予
float
类型实际提供的精度更高。Python会尽最大努力将这样的字面值Map到接近您想要的值。iklwldmw2#
回想一下,Python
float
本质上是一个Cdouble
,它以 * 二进制 * 科学记数法存储。在二进制中,56位整数45345247259849570表示为1010000100011001010000110001101100110011001111001101100010。或者在科学记数法中,1.010000100011001000011000110110011001100111001101100010× 255。(为了便于比较,我将最低有效数字加粗。)
问题是,只有53位有效数字可以存储。所以你的数字被舍入为1.0100001000110010001100011001100110011001100111001101100× 255,即十进制的45345247259849568。
如果您不愿意接受这种舍入误差,解决方案是使用适当的数据类型来存储您的数字。
内置的
int
(或者long
,如果你还在使用Python 2.x)可以精确地存储任何可以容纳在进程内存中的整数(整数)。当然,如果你在小数点右边有数字,它就不起作用了。decimal.Decimal
是一个浮点类型,默认情况下存储28位十进制数字。它非常适合财务计算,其中“$0.01”表示1美元的1/100,而不是0.0100000000000000020816681711721685132943093776702880859375。然而,像1/3这样的非十进制分数仍然只是近似的。
fractions.Fraction
将精确地存储任何有理数作为分子/分母对。