python 3.3.2 我能正确理解函数"round"吗?



抱歉,但我真的不知道在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

  1. round将得到两个数字:123.45123.46

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

  3. 所以,结果123.46

如果number 123.455,就n 2

  1. round将得到两个数字:123.45123.46

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

  3. 所以,结果是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 = 110^-1 = .110^-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。这 不是错误:这是大多数小数部分的结果 不能完全表示为浮点数。

这就是为什么某些浮点数会四舍五入到"错误值",据我所知,真的没有简单的解决方法。(悲伤的脸)如果您想获得与浮点数的不可预测行为不同的行为,则可以使用分数(即表示分子和分母的两个变量)来表示自定义圆形函数中的浮点数。

最新更新