Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 十进制模块:四舍五入_Python_Decimal - Fatal编程技术网

Python 十进制模块:四舍五入

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

我在获取所需的值时遇到一些困难

以下“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('.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')谢谢您的回答。我确实试过了,但正如你在我上面的评论中所看到的,我需要数字与描述的完全一致。在这种情况下,我开始相信我的解决方案并没有那么糟糕。谢谢你的回答。我试过这个,我