Skip to main content
 首页 » 编程设计

python之十进制模块 : rounding

2025年05月04日6zhwl

我在获取所需值时遇到了一些问题。

以下“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"))