Redian新闻
>
Python之谜:四舍五入round(4.5)等于4?

Python之谜:四舍五入round(4.5)等于4?

科技

你好,我是zhen guo!

四舍五入4.5,应该返回结果5,但是使用Python或NumPy内置的round方法计算,结果都返回结果5

先来还原一下:

In [1]: round(4.5)
Out[1]: 4

In [2]: import numpy as np
In [3]: np.round(4.5)
Out[3]: 4.0

如果再看一个例子,四舍五入保留小数点后1位,发现它又是进位的:

In [1]: round(4.15,1)
Out[1]: 4.2

round背后

Python的round使用奇进偶舍方法。

奇进偶舍,是一种计数保留法,是一种数值简化规则。

从统计学的角度,“奇进偶舍”比“四舍五入”更为精确:在大量运算时,因为舍入后的结果有的变大,有的变小,更使舍入后的结果误差均值趋于零

而不是像四舍五入那样逢五就进位,导致结果偏向大数,使得误差产生积累进而产生系统误差。“奇进偶舍”使测量结果受到舍入误差的影响降到最低。

奇进偶舍与四舍五入不同之处的规则有:

  1. 保留位数的后一位如果是5,而且5后面仍有数。例如5.2254保留两位小数为5.23,也就是说如果5后面还有数据,则无论奇偶都要进入。

  2. 保留位数的后一位如果是5,而且5后面不再有数,要根据应看尾数“5”的前一位决定是舍去还是进入:

    • 2.1 如果是奇数则进入
    • 2.2 如果是偶数则舍去。
    • 2.3 例如5.215保留两位小数为5.22,尾数5的前一位是奇数1;    5.225保留两位小数为5.22,尾数5的前一位是偶数2

因此,看到这里,知道奇进偶舍规则后,就回答了第1节所遇问题。

一定要四舍五入

如果期待程序的执行结果,必须严格按照数学定义的四舍五入来计算,使用round就不行了。那么还有其他实现方法吗?

一定有的!使用Python的内置模块decimal

from decimal import Decimal, ROUND_HALF_UP
Decimal(4.5).quantize(Decimal('0'), rounding=ROUND_HALF_UP) 

结果:

Decimal('5')   

ROUND_HALF_UP对应数学中的四舍五入,再看4.15四舍五入保留1位:

Decimal(4.15).quantize(Decimal('1.0'), rounding=ROUND_HALF_UP)

结果:

Decimal('4.2')

以上,希望对你有帮助。

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
Gunicorn 与 Python GIL巅峰后的坠落MNE/Python-fNIRS近红外数据处理中文手册Arduino宣布支持MicroPythonPython程序化套利实战班33 个 "不得不看" 的 Python 关键字总结!硬核观察 #739 Python 虽然是最受欢迎的编程语言,但是找工作还是要会点 SQL字节大佬编写的这本《Python背记手册》,带我横扫互联网大厂秋招!《天才基本法》完结!张子枫学Python的样子,像极了出国后的我自己...Cities Offer Huge ‘Group Buying’ Discounts on Unsold Properties什么是生活方式处方?我的HIIT 处方如何在 Ubuntu 和其他相关 Linux 中安装 Python 3.10 | Linux 中国用 Python 测试 API 的 3 种方式 | Linux 中国10 个 Python 脚本来自动化你的日常任务如何在 Ubuntu 等 Linux 中安装 Python 3.11 | Linux 中国Stuff episode I really don't know because I lost count胡渊鸣:import 一个“太极”库,让 Python 代码提速100倍!Python证书的含金量高吗?How Hangzhou Freed West Lake and Upended Chinese TourismJulia 和 Python,哪一个更快? | Linux 中国ByteHouse实践与思考:如何补全ClickHouse高可用短板?修复 Ubuntu Linux 中 “Command ‘python’ not found” 的错误 | Linux 中国Python 中可观测性的 7 个关键部分 | Linux 中国10个Python脚本来自动化你的日常任务背包徒步-穆尔荒原(John Muir Wilderness)-(上)童年之谜:那种好看的香橡皮,为什么总是擦不干净童年之谜:那种好看的香橡皮,为什么总是擦不干净?4 步打包一个新的 Python 模块 | Linux 中国Python环境搭建手把手图文教程《天才基本法》揭秘Python真实用法,留学生直呼“上当了”陌上花开875 Be Your Mirror, Your Sword, Your Shield, and Your Love波老太的访台, 大概率不会成行揭开8万人滞留三亚的疫情源头之谜:一艘越南渔船的非法交易Macys 黑五海报出炉!家居用品四舍五入不!要!钱!将你的 Python 脚本转换为命令行程序 | Linux 中国
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。