【问题标题】:Python decimal precision and roundingPython十进制精度和舍入
【发布时间】:2016-12-19 03:34:39
【问题描述】:

我想限制我的浮点数的精度并将其用作下一次操作的精确值,但我在十进制模块上做错了。

from decimal import *

factor = 350/float(255)

# Settings
getcontext().prec = 1
getcontext().rounding = ROUND_UP

print Decimal(factor)

Python 输出: 1.372549019607843145962533526471816003322601318359375

预期和想要的结果:1.4

【问题讨论】:

  • 简单地创建一个Decimal 对象不会四舍五入到当前上下文。为此,有一个技巧:您可以应用一元加号,如+Decimal(factor)。话虽如此,这仍然不能满足您的要求:prec 指的是有效数字的总数,而不是该点之后的位数。所以在这种情况下,你需要prec=2
  • 您可能还想查看Decimal.quantize 方法。
  • 您是特别想四舍五入,还是只四舍五入到最接近的小数点后一位浮点数?
  • @JulienBernu numpy.round 没有给你一个确切的表示。它仍然是二进制浮点数。需要decimal 库。
  • >>> getcontext().prec = 2; +Decimal(factor) => Decimal('1.4')

标签: python decimal rounding


【解决方案1】:

来自 Python 文档:(https://docs.python.org/2/library/decimal.html)

新小数的重要性仅由输入的位数决定。上下文精度和舍入仅在算术运算期间发挥作用。

getcontext().prec = 6
Decimal('3.0')
Decimal('3.0')
Decimal('3.1415926535')
Decimal('3.1415926535')
Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85987')
getcontext().rounding = ROUND_UP
Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85988')

所以你需要在运算中使用小数,而不是在打印结果时使用。

【讨论】:

    猜你喜欢
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多