抱歉,但我真的不知道在python 3.3.2文档中定义round
的含义是什么:
round(number[, ndigits])
返回四舍五入到小数点后 n 位数字的浮点值数字。如果省略 ndigits,则默认为零。代表number.__round__(ndigits)
.对于支持
round()
的内置类型,如果两个倍数同样接近,则值将舍入到最接近的 10 的倍数减去 n位数字,则向偶数选择进行舍入(因此,例如,round(0.5)
和round(-0.5)
都是0
,并且round(1.5)
是2
)。如果使用一个参数调用,则返回值为整数,否则与 number 的类型相同。
我不知道为什么 10 和 pow
的倍数.
阅读以下示例后,我认为round(number,n)
的工作方式如下:
如果number
123.456
,就n
2
-
round
将得到两个数字:123.45
和123.46
-
round
比较abs(number-123.45)
(0.006) 和abs(number-123.46)
(0.004),并选择较小的一个。 -
所以,结果
123.46
。
如果number
123.455
,就n
2
:
-
round
将得到两个数字:123.45
和123.46
-
round
比较abs(number-123.45)
(0.005)和abs(number-123.46)
(0.005)。他们是平等的。所以round
检查123.45
的最后一位数字和123.46
.偶数是结果。 -
所以,结果是
123.46
我说的对吗?
如果没有,您能否提供一个可以理解的值版本,四舍五入到最接近的 10 的倍数以幂减去 n位数字?
ndigits = 0 => pow(10, -ndigits) = 10^(-ndigits) = 1
ndigits = 1 => pow(10, -ndigits) = 10^(-ndigits) = 0.1
etc.
>>> for ndigits in range(6):
... print round(123.456789, ndigits) / pow(10, -ndigits)
123.0
1235.0
12346.0
123457.0
1234568.0
12345679.0
基本上,你得到的数字总是 10^(-ndigits) 的整数倍。对于 ndigits=0,这意味着你得到的数字本身就是一个整数,对于 ndigits=1,这意味着它在小数点后不会有一个以上的非零值。
知道任何 0 的幂等于 1 都会有所帮助。随着 n 位数的增加,函数:
f(ndigits) = 10-ndigits
随着 n 位数的增加而变小。具体来说,当您将 n 位数增加 1 时,您只需将精度的小数位向左移动一。例如 10^-0 = 1
,10^-1 = .1
和10^-2 = .01
。答案中 1 的位置是 round
的最后一个精度点。
对于它说的部分
对于支持 round() 的内置类型,值将舍入为 10 最接近幂减 n 位数的倍数;如果两个倍数 同样接近,四舍五入是向偶数选择进行的(因此,对于 例如,round(0.5) 和 round(-0.5) 都是 0,round(1.5) 都是 2)。
这在 Python 3 中具有意外行为,并且不适用于所有浮点数。考虑您给出的示例,round(123.455, 2)
产生值 123.45。这不是预期的行为,因为10^-2
的最接近的偶数倍数是 123.46
,而不是 123.45
!
要理解这一点,您必须特别注意以下注释:
注意 round() 对于浮点数的行为可能令人惊讶: 例如,round(2.675, 2) 给出 2.67 而不是预期的 2.68。这 不是错误:这是大多数小数部分的结果 不能完全表示为浮点数。
这就是为什么某些浮点数会四舍五入到"错误值",据我所知,真的没有简单的解决方法。(悲伤的脸)如果您想获得与浮点数的不可预测行为不同的行为,则可以使用分数(即表示分子和分母的两个变量)来表示自定义圆形函数中的浮点数。