关于为什么有四舍五入还要奇进偶舍的一些个人理解 python中round()不能直接实现四舍五入甚至不能直接实现奇进偶舍的解释

四舍五入方法比较简单但对于一些问题四舍五入精度不够,下图是我理解对四舍五入存在问题之一的理解

 1234 56789 有木有发现很不公平 4种情况<5种情况

 问题就出现在了要四舍五入的那一的后一如果是中间的5上,如0.125保留两位小数。如果规定5放到“入”的情况,则“入”有五种情况,面对大量数据处理结果会偏大;如果规定5放到“舍”的情况,则“舍”有五种情况,面对大量数据处理结果会偏小。

所以为了优化四舍五入带来的偏大问题,我们只要让要四舍五入那一位的后一位是5的情况时,进退足够公平,就可以解决了。

于是就有了奇进偶舍的规定,奇进偶舍如下:

(假设我们现在要保留小数点后两位小数!)

1.当四舍五入的那一后一1 2 3 46 7 8 9时,如0.121,0.122,0.123,0.124和0.126,0.127,0.128,0.129时,此时四舍五入没有公平性问题,不会偏大偏小,所以规定就按四舍五入来。

2.当要四舍五入那一后一是5时,此时若后一位的后面还有非零数,如0.1251,0.1252......0.12590.1250001由于都是会导致原本中立的0.125偏向大的数,所以规定此时进位成0.13

3.要四舍五入那一后一是5时,此时若后一位的后面只有0(和没数了其实是一种情况)或没数了,如0.12500(其实和0.125  一样)。此时正好位于0.12和0.13的正中间,进退位都一样,需要一个能等分可能的方法。于是规定根据5前面的要四舍五入的那一的奇偶来公平的决定进退。为什么公平?前面的(即要四舍五入的那一)可能为02468 13579两种情况五五开,进退位等可能,面对大量无规律数据处理结果的预期能更加接近准确。如0.105,0.125,0.145,0.165,0.185规定退为0.10,0.12,0.14,0.16,0.18。如0.115,0.135,0.155,0.175,0.195,规定进为0.12,0.14,0.16,0.18,0.20

python中的round函数就是按照奇进偶舍的处理的(一定一定要注意奇进偶舍是对计算机储存后的数进行操作的,传入的浮点数会被计算机精确储存的情况下就是你传入的数,如果未能精确储存则按储存后的数来算!!! 后面有个例子可以看一下)

>>>round(0.124,2)
0.12
>>>round(0.125001,2)
0.13
>>>round(0.125,2)
0.12
>>>round(0.1250,2)
0.12
>>>round(0.375,2)
0.38

注意下面的例子

>>>round(1.115,2)
1.11

 按奇进偶舍的规则预测应为1.12,但是1.115在计算机中实际储存为1.1149999999999999911182所以实际上是1.1149999999999999911182在奇进偶舍而不是输入的1.115,所以得到个1.11

所以影响round输出的先要看计算机储存的数是多少而不是直接看你输入的数!!!

round函数之所以采取奇进偶舍的策略可能是因为在计算机里面,浮点数储存有时是不精确的,面对这些用户可能传入的任何浮点数应使用一种尽量较为科学的进退位方法:奇进偶舍

如何精确的四舍五入和奇进偶舍一种方法是可以用Decimal,具体方法看下面第一篇博客讲的很好。

我在阅读这两篇文章后写下本篇,第一篇虽然老哥脾气有点暴躁但问题确实是说到痛点上了👍。

为什么你需要少看垃圾博客以及如何在Python里精确地四舍五入 - 个人文章 - SegmentFault 思否

[Python]round四舍五入精度缺失的解决 - Nerve 叨位去 - SegmentFault 思否

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值