Python 设置位数时,数字如何舍入?
首先,我已经阅读了所有相关的答案。如上所述,Python 设置位数时,数字如何舍入?,python,python-3.x,Python,Python 3.x,首先,我已经阅读了所有相关的答案。如上所述,舍入函数将半个数字舍入为最接近的偶数。一个简单的例子: >>> round(0.5) 0 >>> round(1.5) 2 >>> round(2.5) 2 >>> round(3.5) 4 >>> round(4.5) 4 >>> round(5.5) 6 现在,我仍然不明白当我们设置位数时,round函数是如何工作的: >>&g
舍入
函数将半个数字舍入为最接近的偶数。一个简单的例子:
>>> round(0.5)
0
>>> round(1.5)
2
>>> round(2.5)
2
>>> round(3.5)
4
>>> round(4.5)
4
>>> round(5.5)
6
现在,我仍然不明白当我们设置位数时,round
函数是如何工作的:
>>> round(0.05, 1)
0.1
>>> round(0.15, 1)
0.1
>>> round(0.25, 1)
0.2
>>> round(0.35, 1)
0.3
>>> round(0.45, 1)
0.5
>>> round(0.55, 1)
0.6
>>> round(0.65, 1)
0.7
>>> round(0.75, 1)
0.8
>>> round(0.85, 1)
0.8
>>> round(0.95, 1)
0.9
这是怎么回事?为什么我会得到这些结果?背后的理由是什么?它看起来不像是使用偶数。这里的问题与浮点运算有关,Python中的浮点文本
0.85
实际上并不意味着0.85
,而是一些非常接近该值的表示。考虑:
>>> round(0.85, 1)
0.8
在这种情况下,值
0.85
由0.849999999
或类似的值表示,其四舍五入为0.8
。我这里没有确切的解决方法,但是如果您需要浮点值的精确算术,您可以考虑使用十进制类型。为了进一步证实@Tim Biegeleisen所说的,这里有一个小实验:
>>> for n in [0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95]:
... print('{:.50f}'.format(n) + ' -> ' + str(round(n, 1)))
...
0.05000000000000000277555756156289135105907917022705 -> 0.1
0.14999999999999999444888487687421729788184165954590 -> 0.1
0.25000000000000000000000000000000000000000000000000 -> 0.2
0.34999999999999997779553950749686919152736663818359 -> 0.3
0.45000000000000001110223024625156540423631668090820 -> 0.5
0.55000000000000004440892098500626161694526672363281 -> 0.6
0.65000000000000002220446049250313080847263336181641 -> 0.7
0.75000000000000000000000000000000000000000000000000 -> 0.8
0.84999999999999997779553950749686919152736663818359 -> 0.8
0.94999999999999995559107901499373838305473327636719 -> 0.9
谢谢蒂姆!看看我的实验,你有关于0.25和0.75的线索吗?第一个是使用楼层功能,第二个是使用ceil@RiccardoBucco实际的表示可能取决于很多因素,包括Python版本、操作系统等。这里的“最佳”答案是接受浮点的本质,然后在Python中执行var=0.85
时,不一定会得到精确的值。@RiccardoBucco 0.25和0.75是2的幂的整数倍,因此它们完全由浮点数学表示。正如您所期望的,0.25
向下四舍五入为0.2
,0.75
向上四舍五入为0.8
,0.85
表示值7656119366529843/2**53=0.8499999999999999977553950749691527366818359375。根据您的问题:“舍入函数将半个数字舍入到最近的偶数。”@RiccardoBucco