python 3.3.2我能正确理解“圆形”功能吗?

时间:2013-11-18 13:27:42

标签: python rounding

很抱歉,但我真的不知道python 3.3.2 doc中round定义的含义是什么:

  

round(number[, ndigits])
  将小数点后的浮点值 number 舍入为 ndigits 位。如果省略 ndigits ,则默认为零。代表number.__round__(ndigits)

     

对于支持round()的内置类型,如果两个倍数相等,则将值四舍五入为10的最接近的倍数 ndigits ,向均匀方向舍入选择(例如,round(0.5)round(-0.5)都是0round(1.5)2)。如果使用一个参数调用,则返回值为整数,否则与 number 的类型相同。

我不知道为什么 10的多个pow

阅读以下示例后,我认为round(number,n)的作用类似于:

如果让number123.456,请n2

  1. round将获得两个号码:123.45123.46

  2. round会比较abs(number-123.45)(0.006)和abs(number-123.46)(0.004),并选择较小的一个。

  3. 因此,123.46就是结果。

  4. 如果让number123.455,请n2

    1. round将获得两个号码:123.45123.46

    2. round比较abs(number-123.45)(0.005)和abs(number-123.46)(0.005)。他们是平等的。因此,round会检查123.45123.46的最后一位数字。结果是偶数。

    3. 所以,结果是123.46

    4. 我是对的吗?

      如果没有,你能否提供一个可理解的值的版本四舍五入到10的最接近的倍数到功率减去ndigits

2 个答案:

答案 0 :(得分:2)

有助于知道0的幂等于1.随着ndigits增加,函数:

随着你增加ndigits,

f(ndigits) = 10-ndigits会变小。特别是当你将ndigits增加1时,你只需将精度的小数位移到左边。例如10^-0 = 110^-1 = .110^-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,这意味着它在小数点后不会有多个非零值。