我有这两个值需要四舍五入到两个小数空格

n = 59.9250
n1 = 459.4250

print(round(n, 2))
print(round(n1, 2))

输出

59.92
459.43

有人能解释一下原因吗?有没有一种方法可以像我使用3.6.8版的python时一样将这两种情况进行循环

推荐答案

对于内置的浮点对象,Python使用IEEE-754双精度数字,这意味着绝大多数数字不能准确表示.您可以通过创建一个恰好在限制之下和之上的变量来进行实验测试:

>>> n3 = 1e308 ; n3
1e+308
>>> n3 = 1e309 ; n3
inf

但是,由于CPython是开源的,您也可以通过查看处理浮点对象的代码来验证这一点.在CPython中,它可以在Objects/floatobject.c中找到,您将看到代码中夹杂着用来保存值的Cdouble变量.


因此,如果您在转换站点(如this binary converter)中键入这两个数字,您将看到它们转换为最接近的匹配项,如下所示:

                   |
 59.925       59.92499999.....something
459.925      459.42500000..1..something
                   |

您可以在这里看到,遵循"下一位数为0..4,向上舍入为5..9"的规则,第一位数将取整down59.92,因为下一位数是4(请记住,这里没有特殊的"半途而废"行为,因为两者都不是半途而废).

出于同样的原因,第二个数字将舍入up459.93,因为它的下一个数字是5.

Python documentation for round人实际上提出了这样一种可能性:

注意:对于浮点数,round()的行为可能令人惊讶:例如,round(2.675, 2)等于2.67,而不是预期的2.68.这不是错误:这是因为大多数小数不能精确地表示为浮点数.有关详细信息,请参阅Floating Point Arithmetic: Issues and Limitations.


如果您really想要避免这个问题,您应该跳过使用内置浮点对象及其所有缺点,而 Select 使用Decimal类.

然后,您可以使用它以多种方式处理数字,同时避免损失精度.例如,以下文字记录:

  • 创建exact值(不是某个最接近的浮点匹配);
  • 更改上下文,使其将半个值从零(您可能认为从ROUND_HALF_UP指定符向上舍入到无限大)取整,而不是使用银行家的舍入;然后
  • 将值四舍五入到小数点后两位
>>> d = decimal.Decimal("59.925")
>>> decimal.getcontext().rounding = decimal.ROUND_HALF_UP
>>> round(d, 2)
Decimal('59.93')

Python-3.x相关问答推荐

Pandas—在特定列上比较两行双框,并根据特定条件保留其中一行?

如何从Django连接到Neo4J s AuraDB(免费层)?'

PythonPandas -通过知道位置(Loc)而不是索引来删除行

Python3和请求-超文本标记语言:试图抓取一个网站-没有取回真正的超文本标记语言代码

Python多处理池:缺少一个进程

为什么 get_form 方法中小部件的更改没有反映 Django 管理站点中的更改

Keras 中 Conv2D 层的意外结果

pytorch 中 mps 设备的 manual_seed

如何知道Pandas 列中的每个后续值是否都大于前面的值? Python相关

Python:如何从句子/段落中提取地址(非正则表达式方法)?

python用户输入5个偶数并打印最大的

ValueError:找不到子字符串,我做错了什么?

Python:如何判断一个项目是否被添加到一个集合中,没有 2x(hash,lookup)

理解 Keras 的 ImageDataGenerator 类中的 `width_shift_range` 和 `height_shift_range` 参数

使用 Python 3 按行进行分析

virtualenv virtualenvwrapper virtualenv:错误:无法识别的参数:--no-site-packages

Anaconda 中的依赖项和包冲突?

Python的max函数有多高效

如何制作函数Collection

使用完整路径激活 conda 环境