Python 十进制模块:四舍五入
我在获取所需的值时遇到一些困难 以下“abc”字符串表示角度。 “result”字符串表示我要查找的值Python 十进制模块:四舍五入,python,decimal,Python,Decimal,我在获取所需的值时遇到一些困难 以下“abc”字符串表示角度。 “result”字符串表示我要查找的值 a = '199.1224' result = '199.122400000000000' b = '199.0362' result = '199.036200000000010' c = '-199.9591' result = '-199.959100000000010' 我使用以下代码: Decimal(float(a)).quantize(Decimal('.000000000
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(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.03620000000000008')
,就像第一个一样,但是第二个是Decimal('199.0362000000000000')
。那么,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"))
我认为问题在于使用
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.03620000000000008')
,就像第一个一样,但是第二个是Decimal('199.0362000000000000')
。那么,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"))
- 如果在
中使用量化
而不是'0e-14'
,则无需计算数字以检查其正确性'0.00000000000001'
- 使用
函数将其转换为具有特定小数位数的字符串format
- 如果在
中使用量化
而不是'0e-14'
,则无需计算数字以检查其正确性'0.00000000000001'
- 使用
函数将其转换为具有特定小数位数的字符串format
'199.122400000000010'
,或者第二个结果应该是'199.03620000000'
'abc'是输入的数字。结果代表了我希望实现的价值观。我正试图模拟一个软件工具来实现这一点。问题是:a=199.1223999999999 b=199.0362000000000008 c=-199.959100000000007这样的结果不够精确。我不知道软件是如何转换这些数字的,我也不知道怎么回事。我很困惑,为什么a
的预期结果以00
结尾,而b
的预期结果以10
结尾?所以最后,换言之,我的问题是:如果我有a=199.0362000000000008,是否可以舍入到199.0362000000000010,以零结尾,而不需要像我使用的解决方法那样的技巧。@flornake如果你看看值和舍入发生的位置,你就会明白为什么(我使用了[]):->>Decimal(199.0362)Decimal('199.03620000000000[08]00355337560176849365234375')->>>十进制(199.1224)十进制('199.1223999999[98]9540810929611325326397705078125')我不清楚你想要什么。似乎第一个结果应该是'199.122400000000010'
,或者第二个结果应该是'199.03620000000'
'abc'是输入的数字。结果代表了我希望实现的价值观。我正试图模拟一个软件工具来实现这一点。问题是:a=199.1223999999999 b=199.0362000000000008 c=-199.959100000000007这样的结果不够精确。我不知道软件是如何转换这些数字的,我也不知道怎么回事。我很困惑,为什么a
的预期结果以00
结尾,而b
的预期结果以10
结尾?所以最后,换言之,我的问题是:如果我有a=199.0362000000000008,是否可以舍入到199.0362000000000010,以零结尾,而不需要像我使用的解决方法那样的技巧。@flornake如果你看看值和舍入发生的位置,你就会明白为什么(我使用了[]):->>Decimal(199.0362)Decimal('199.03620000000000[08]00355337560176849365234375')->>>十进制(199.1224)十进制('199.1223999999[98]954081092961132566397705078125')谢谢您的回答。我确实试过了,但正如你在我上面的评论中所看到的,我需要数字与描述的完全一致。在这种情况下,我开始相信我的解决方案并没有那么糟糕。谢谢你的回答。我试过这个,我