【问题标题】:How to store exact decimal number without any rounding in python如何在python中存储精确的十进制数而不进行任何舍入
【发布时间】:2019-06-12 18:59:44
【问题描述】:

我有一个数字 -123456789012345678.879,它是从 json 文件解析并存储在 dict 中的。在字典中显示为 -1.23456789012e+17

我想取回原始的完整十进制数并在输出到文件时保持原样。

a=-1.23456789012e+17

print(a)

-1.23456789012e+17

所以要删除 python 正在格式化的指数,因为我还尝试从十进制模块转换为十进制

Decimal(a)

Decimal(-123456789012345680)

在这两种情况下,python 都在改变我想要的小数的精确表示。我不希望对原始小数进行任何舍入或更改。

我目前没有将原始解析值格式化为字符串 a 的选项,需要另一种方法将 python 指数数字转换回原始格式

【问题讨论】:

  • 嗨 Jimmy,你用什么来存储数据?也许它是由数据库或您使用的任何东西四舍五入的?
  • 您是否尝试过将a 设为字符串(即a = "-12....678.929",然后然后 执行Decimal(a)?在我看来,a 失去了精度在你分配它的那一刻,因为浮点数对于你想要做的事情来说不够精确。保持它为字符串形式,直到你可以把它变成一个可以处理精度的Decimal 会缓解这个问题
  • 根据您要执行的具体操作,您需要的解决方案可能会发生变化。如果您只想打印该值,则可以使用字符串格式来获得所需的精度。如果您确实需要完全精确地存储数字,您可以使用decimal 包中提供的其他选项。
  • Decimal() 期望字符串,您尝试传递浮点数。

标签: python decimal rounding


【解决方案1】:

我不确定我是否理解这个问题,但请记住,Decimal 只是一个类 - 它不能对传递给它的值施展魔法。当您丢失浮点数的精度时,这发生在 Decimal 调用之前,因此该类无法恢复丢失的信息。

为避免这种情况,Decimal 类还允许您从字符串构造值。这样可以避免丢失精度:

>>> from decimal import Decimal
>>> Decimal('-123456789012345678.929')
Decimal('-123456789012345678.929')
>>> print(Decimal('-123456789012345678.929'))
-123456789012345678.929

更多详情,请咨询documentation

【讨论】:

    猜你喜欢
    • 2016-12-19
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多