Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 设置位数时,数字如何舍入?_Python_Python 3.x - Fatal编程技术网

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