我在获取所需值时遇到了一些问题。
以下“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'
所以用少一位小数进行量化,转换为字符串(无论如何都必须这样做)并添加一个零。 这让我得到了具有数千个这些值的正确的期望结果。 但我想知道是否有正确的方法来四舍五入并以零结尾(不知道这个的英文单词)。
请您参考如下方法:
我认为问题在于使用float(a)。对于大多数终止小数部分,浮点类型没有精确表示。我用过:
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(float(b), ".15g")
这将抑制尾随小数零,并在更方便时切换为科学记数法。但它会将结果四舍五入到 15 位有效数字。您可能必须将结果格式化为所需的固定小数位数:
d = Decimal(float(b), ".15g")
print ("d = " + format(d, ".12f"))
