很抱歉,但我真的不知道python 3.3.2 doc中round
定义的含义是什么:
round(number[, ndigits])
将小数点后的浮点值 number 舍入为 ndigits 位。如果省略 ndigits ,则默认为零。代表number.__round__(ndigits)
。对于支持
round()
的内置类型,如果两个倍数相等,则将值四舍五入为10的最接近的倍数 ndigits ,向均匀方向舍入选择(例如,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的最接近的倍数到功率减去ndigits ?
答案 0 :(得分:2)
有助于知道0的幂等于1.随着ndigits增加,函数:
随着你增加ndigits, f(ndigits) = 10-ndigits
会变小。特别是当你将ndigits增加1时,你只需将精度的小数位移到左边。例如10^-0 = 1
,10^-1 = .1
和10^-2 = .01
。 1在答案中的位置是round
的最后一个精确点。
对于它所说的部分
对于支持round()的内置类型,值将四舍五入为 最接近10倍的功率减去ndigits;如果两个倍数 同样接近,对均匀选择进行舍入(因此,对于 例如,圆形(0.5)和圆形(-0.5)均为0,圆形(1.5)为2)。
这在Python 3中有意外行为,不适用于所有浮点数。考虑一下您给出的示例,round(123.455, 2)
得到的值为123.45。这是不预期的行为,因为10^-2
的最接近偶数倍是123.46
,而不是123.45
!
要理解这一点,您必须特别注意下面的注释:
注意浮点数的round()行为可能会令人惊讶:for 例如,round(2.675,2)给出2.67而不是预期的2.68。这个 这不是一个错误:它是大多数小数部分的结果 不能完全表示为浮点数。
这就是为什么某些花车将会转向“错误的价值”,据我所知,确实没有简单的解决方法。 (sadface)如果要获得与浮点数不可预测的行为不同的行为,则可以使用分数(即表示分子和分母的两个变量)来表示自定义循环函数中的浮点数。
答案 1 :(得分:1)
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,这意味着它在小数点后不会有多个非零值。