3

我在获得所需的值时遇到了一些麻烦。

以下“abc”字符串表示角度。“结果”字符串代表我正在寻找的值。

a = '199.1224'
result = '199.122400000000000'

b = '199.0362'
result = '199.036200000000010'

c = '-199.9591'
result = '-199.959100000000010'

我使用以下代码:

Decimal(float(a)).quantize(Decimal('.000000000000001'), rounding=ROUND_HALF_UP)

results in 
a = 199.122399999999999
b = 199.036200000000008
c = -199.959100000000007

我不是数学天才,并且在 Decimal 模块中尝试了几乎所有可能的方法,但我似乎无法找到获得所需结果的正确方法。

作为一个糟糕的解决方法,我使用:

Decimal(float(a)).quantize(Decimal('.00000000000001'), rounding=ROUND_HALF_UP)
str(a)+'0'

所以用少一位小数进行量化,转换为字符串(无论如何都必须这样做)并添加一个零。这让我得到了具有数千个这些值的正确期望结果。但我想知道是否有正确的方法来四舍五入并以零结尾(不知道这个英文单词)。

4

2 回答 2

0

我认为问题在于使用float(a). float 类型对于大多数终止小数部分没有精确的表示。我用了:

from decimal import *
b = '199.0362'
Decimal(float(b)).quantize(Decimal('.000000000000001'), rounding=ROUND_HALF_UP)
Decimal(b).quantize(Decimal('.000000000000001'), rounding=ROUND_HALF_UP)

并得到Decimal('199.036200000000008'),就像您在第一个上所做的那样,但Decimal('199.036200000000000')在第二个上。那么...... float() 转换为您做了什么,您不能只使用第二个版本?

如果您需要从计算的浮点结果中获取输入,请记住您只能获得大约 52 位有效位,或大约 52*log10(2) ~~ 15.6 个十进制数字。所以第 16 位有效数字可能没有正确四舍五入。出于实际目的,通常将其设为 15。您可以使用 format 函数在字符串中获得舍入结果:

format(float(b), ".15g")

这将抑制尾随小数零,并在更方便时切换到科学记数法。但它会将结果四舍五入到 15 位有效数字。您可能必须将结果格式化为所需的固定小数位数:

d = Decimal(float(b), ".15g")
print ("d = " + format(d, ".12f"))
于 2013-08-26T15:30:43.393 回答
-1
import decimal
from decimal import Decimal

b = '199.0362'
result = Decimal(float(b)).quantize(Decimal('0e-14'), rounding=decimal.ROUND_HALF_UP)
print format(result, '.15f')

# a:  '199.1224' ->  '199.122400000000000'
# b:  '199.0362' ->  '199.036200000000010'
# c: '-199.9591' -> '-199.959100000000010'
  • 如果您使用'0e-14'而不是'0.00000000000001'in quantize,则不必计算数字来检查它是否正确。
  • 使用该format函数转换为具有特定小数位数的字符串。
于 2013-08-27T13:15:34.437 回答