Python Scientific Notation Suppress

tzdcorbm  于 2023-03-24  发布在  Python
关注(0)|答案(2)|浏览(72)

简单地说,我有科学计数法4.534524725984957e+16,我试图得到抑制。
这里正确的数字是45345247259849570 ...但是python总是返回错误的数字,比如45345247259849568 ...有什么想法吗?

mf98qq94

mf98qq941#

浮点字面值给予float类型实际提供的精度更高。Python会尽最大努力将这样的字面值Map到接近您想要的值。

>>> float(45345247259849570)
4.534524725984957e+16
>>> float(45345247259849568)
4.534524725984957e+16
>>> float(45345247259849570) == float(45345247259849568)
True
>>> float(45345247259849570) == 4.534524725984957e+16
True
iklwldmw

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。

>>> 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将精确地存储任何有理数作为分子/分母对。

>>> from fractions import Fraction
>>> Fraction('4.534524725984957e+16')
Fraction(45345247259849570, 1)

相关问题