0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python的四舍五入如何去实现呢

夏日余晖 来源:Harmony技术专家 作者:Harmony技术专家 2022-10-12 11:19 次阅读

Python 的四舍五入,还真有点小麻烦。

1、使用 round

大多数情况下,我们会使用 round 来保留小数,但这并不符合我们在数学知识里的规则。

round(number[,ndigits])

round() 把 number(通常是浮点数) 按如下规则(Python3)进行四舍五入的:

先说下 ndigits 不为 0 的情况:

如果保留位数的后一位小于等于 4,则舍去,如 round(5.214,2) = 5.21

如果保留位数的后一位等于 5,且该位数后面没有数字,则不进位,如 round(5.215,2) = 5.21

如果保留位数的最后一位等于 5,且该位数后面有数字,则进位,如 round(5.2151,2) = 5.22

如果保留位数的最后一位大于等于 6 ,则进位。如 round(5.216,2) = 5.22

pYYBAGNGMbWACbu7AABQ_srL7p0219.png

但是上述规则 2 也有例外,比如:

poYBAGNGMcaAAtltAAAsBFtEigA081.png

究其原因,浮点数用用二进制表示的时候只能表示近似值,虽然我们看到的是 0.645,实际上 Python 存储的是 0.645000000000000017763568394002504646778106689453125,Python 是按照 IEEE754 标准存储浮点数的。

再说下 ndigits 为 0 或 None 的情况:

如果保留位数的后一位小于等于 4,则舍去,如 round(1.4) = 1

如果保留位数的后一位等于 5,且后面没有数字,则取最近的偶数,如 round(1.5)=2,round(2.5)=2

如果保留位数的后一位等于 5,且后面有数字,则近位,如 round(2.51)=3

如果保留位数的最后一位大于等于 6 ,则进位。如 round(1.6) = 2

pYYBAGNGMd-AK2V8AABIAXzTvvY705.png

请注意, f 字符串的保留结果与 round 一致:

pYYBAGNGMfGAWET8AAAskhIuCfA979.png

那么如何获得和数学上的四舍五入规则一致的方法呢?请使用方法二:

2、使用 Decimal

这种方法有个前提,那就是必须先把小数转换成字符串,这样才可以精确的表示浮点数。

pYYBAGNGMgOAYrecAACsIjyFzsQ078.png

以上程序的输出如下:

poYBAGNGMhWAcDI6AAAqS_zOmzo317.png

完全符合我们数学上的四舍五入。

最后的话

浮点数在二进制的表示方法中只能表示近似值。了解了浮点数表示法之后,再看四舍五入,就不会觉得那么奇怪了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • python
    +关注

    关注

    56

    文章

    4796

    浏览量

    84671
收藏 人收藏

    评论

    相关推荐

    LabVIEW如何实现四舍五入

    LabVIEW默认的实现的是科学四舍五入,而不是真正的、传统的四舍五入,怎样把2.5四舍五入为3?LabVIEW算出居然是2,并且试了好几种方法都没有办法得到3,真是太无语了。
    发表于 01-25 00:16

    怎么让1位小数四舍五入

    就是保留一位小数,多余的四舍五入。不要前面板设置的那种,labview可以做得到吗?大神帮帮忙~!
    发表于 11-29 15:21

    在stm32中做float数的乘法运算,结果小数部分总是被四舍五入

    我在stm32中做float数的乘法运算,结果小数部分总是被四舍五入了,感觉好奇怪哦,代码如下 float xreal[1024]={0}; float yimag[1024]={0}; float prodreal,prodimag,temp; for(i=0;i
    发表于 03-14 06:35

    请问如何将汇编写的函数变成内联函数?

    比如TI提供的四舍五入函数rnd_SP_RS.asm,怎么做成内联函数?这样比较省时间。谢谢!
    发表于 05-07 09:32

    labview 45

    labview没有现存的四舍五入的程序,附件是保留小数点后两位,大家可以参考着改成可以设置小数位的VI。
    发表于 01-14 09:51

    如何在iMX8M mini上捕捉奇怪的分辨率?

    我正在为 iMX8M 迷你模块开发传感器驱动程序。此传感器允许具有奇数高度值的分辨率,例如宽度=240 x 高度=135。我注意到每次输入奇数高度时,该值都会四舍五入到下一个偶数,在本例中,从 135 四舍五入到 136。这是一些特定于平台的限制吗?有什么理由不支持奇怪的
    发表于 03-24 07:25

    LabView设计程序,利用“六入成双”的方法实现数字的舍入功能。

    请教各位大佬,目前只能实现四舍五入” 原理:“465凑偶”,这里“”是指≤4 时舍去,\"六\"是指≥6时进上,\"
    发表于 05-13 10:56

    单片机取下整怎么四舍五入

    单片机取下整怎么四舍五入
    发表于 09-26 08:17

    Xilinx平方根IP核的整形平方根算法

    Round Pos Inf:四舍五入,+0.5之后四舍五入,在负数时和第三种有区别。
    发表于 07-12 08:38 2672次阅读
    Xilinx平方根IP核的整形平方根算法

    西门子PLC中四舍五入和截取函数显示

    四舍五入和截取函数也属于数据类型转换函数。下表显示了这些函数的名称、数据类型(输入参数和函数值)和任务。 “取整”指令用于将输入 IN 的值取整为最接近的整数。该指令将输入 IN 的值解释为浮点数
    的头像 发表于 08-16 16:08 6457次阅读

    四舍五入的数字、典型规格和模拟的危险

    发表于 11-17 12:41 0次下载
    <b class='flag-5'>四舍五入</b>的数字、典型规格和模拟的危险

    四舍五入数字、典型规格和模拟的危险

    本教程强调了谨慎设计电路的重要性,并仔细思考设计的各个方面。很多时候,工程师被数据手册的规格引入歧途,要么是因为它们是四舍五入的,要么是因为工程师只记住了典型规格。无论出现哪个陷阱,设计都可能产生灾难性的结果。本文档解释了为什么依赖四舍五入的数字和典型规格,以及支持仿真而
    的头像 发表于 02-10 10:42 894次阅读
    <b class='flag-5'>四舍五入</b>数字、典型规格和模拟的危险

    ROUND函数是什么意思?

    ROUND函数是Excel中的一个基本函数,作用按指定的位数对数值进行四舍五入,语法是ROUND(number,num_digits)。
    的头像 发表于 05-25 15:22 2.5w次阅读
    ROUND函数是什么意思?

    FPGA加法截位处理方法介绍

    本模块实现输入与输出位宽相同数据加法,并对结果进行四舍五入截位,对标matlab round函数。
    的头像 发表于 04-18 16:53 793次阅读

    接地探针如何计算

    安培数计算:对于每1A的电流(四舍五入到下一个最高整数),需要一个探针。
    的头像 发表于 04-29 09:39 702次阅读