Python中的默认舍入模式(舍入到最近等)是什么?我们如何指定它?
答案 0 :(得分:9)
使用基于IEEE754的平台(与大多数现代平台一样,包括x86,ARM,MIPS ......),它的默认模式“round to nearest,ties to even”是Python标准库中唯一可用的模式。这是由标准化的默认值和库方法的缺失“提供”来改变它。有更多的语言不允许改变舍入模式 - 例如Java - 所以这不是一个孤立的Python奇思妙想。
实际上,改变这一点的理由太少了。 IEEE754的直接舍入模式在其使用中非常特殊。 (我不道歉坚持默认舍入的方法,但只是对它进行评论。)例如,将1e308乘以1e308并将舍入为零或减去无穷大导致大约1.8e308,因此,结果也是如此远离确切答案和基于POLA的一个(无穷大)。如果您确实需要某些特定的模式进行计算,请考虑使用特定的库,如MPFR或gmpy2。
如果您坚持在没有专门用于浮点计算的外部模块的情况下进行更改,请尝试通过fesetround
模块或模拟使用C库ctypes
,例如here。同样,您可以选择使用此类黑客并对所有后果负责。我建议将带有特殊舍入的所有部分包装到C级代码中,以便在函数退出时恢复默认模式。
答案 1 :(得分:1)
接受的答案不是真的正确。当有人问起舍入模式时,浮点数可能是首先想到的,但它们并不是您应该看的地方。
原因很简单:舍入是使答案的位数减少的一种方法。每当您提到数字时,都必须确保您在说什么基础。我具体不了解您,但是当人们谈论数字时,它们通常表示十进制数字。为此,浮点数显然是不够的,因为它们具有 binary 位。您不能将浮点数0.12
舍入到一个十进制数字,因为它没有意义:尽管有这种外观,但它却没有这种数字。 :-)
当然,您可以做的是尝试通过对浮点数进行四舍五入来补偿浮点数的十进制不精确性,以便使上冲和下冲以最佳方式相互抵消,并且在这种情况下,很早以前就已经证明开箱即用,只有一个正确的答案ROUND_HALF_EVEN-,它是由float(和round
函数,如果需要在小数点后一位)提供的。但是请注意,它与“计算平均等级”(通常为ROUND_HALF_UP),“估算平均错误”(ROUND_UP),“为您提供税级(ROUND_FLOOR)或其他需要执行的其他特定任务”不同固定数目的十进制数字(或者对于某些现在已经失效的货币,某些其他基数,但通常不是二进制)。
实际上,有一个Python标准库模块为您提供了所有可能有用的舍入模式,鉴于以上几段,它是看起来很合逻辑的地方:当然,它是decimal
模块。它代表的浮点数不是以2为底,而是以10为底,因此,它提供了有意义的可能性,即使用对特定任务有意义的舍入方法将数字舍入到给定的小数位数。
>>> import statistics, decimal
>>> grades = map(decimal.Decimal, [4, 5])
>>> print(statistics.mean(grades).to_integral_exact(decimal.ROUND_HALF_UP))
5
HTH。
答案 2 :(得分:-1)
我过去曾使用过这些,没有任何负面影响:
from math import floor, ceil
def round_floor(scale, x):
return floor(x*(10**scale))/(10**scale)
def round_ceiling(scale,x):
return ceil(x*(10**scale))/(10**scale)
但是我没有考虑过非常大或非常精确的数字的含义。
>>> round_floor(1,123.456)
123.4
>>> round_floor(-1,123.456)
120.0
>>> round_floor(2,123.456)
123.45
>>> round_ceiling(1,123.456)
123.5
>>> round_ceiling(-1,123.456)
130.0
>>> round_ceiling(-2,123.456)
200.0
答案 3 :(得分:-2)
round()是用于舍入的内置函数。它的工作原理如下:
round(number [,ndigits])
它返回你用ndigits十进制数舍入的浮点类型数
将值四舍五入为函数减去ndigits的最接近的10的倍数;如果两个倍数相等,则向均匀选择进行舍入(例如,圆形(0.5)和圆形(-0.5)都是0,圆形(1.5)是2)。如果使用一个参数调用,则返回值为整数,否则与数字类型相同。
限制: https://docs.python.org/3/tutorial/floatingpoint.html#tut-fp-issues