知行编程网知行编程网  2022-12-07 05:30 知行编程网 隐藏边栏  24 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于python里保留小数时5为什么舍去的相关知识,希望可以帮到处于编程学习途中的小伙伴

python中保留小数时舍弃5的原因是:当舍入函数遇到“.5”时,如果要舍入的数字前的小数是奇数,则直接舍弃,如果是a偶数,则向上取整。



为什么在 python 中保留小数时 5 会四舍五入?



round( )函数简介


菜鸟教程中介绍过,round()的作用是返回浮点数x的四舍五入后的值。

> round( x [, n] )

参数x和n都是数值表达式,返回值是x的四舍五入值。 n为保留的小数位数,如果不加n,则只保留x的四舍五入整数部分。

>>> round(2.3)
2
>>> round(2.45, 1)
2.5


特殊情况

上面的结果并没有错误,这里再用2.675测试一下:

>>> round(2.675, 2)
2.67

显然结果不符合四舍五入规则。为什么会这样?原因是:round() 函数只有一个参数。当没有指定位数时,返回一个整数,并且是最接近的整数,类似于四舍五入。在指定小数位数时四舍五入一般使用四舍五入规则,但是在.5的情况下,如果要四舍五入的数字前的小数是奇数,直接舍弃,如果是偶数,则向上取整。

小数位的四舍五入在项目中经常用到,今天群里有人提出1.325 如何才能变成1.33?

当时我一看这么简单,分秒就可以解决:

我回复是这样的的

round(1.315,2)

有个小伙伴 当时就回复:

他要的结果是 1.32, 你打印出是1.31,我看到我想怎么可能呢,我自己运行下,

结果真是1.31 .

我想都没想,我觉得我是对的,嗯,难怪开发者不能测试自己的代码。

我就开始查找原因,我们通过代码进行讲解:

print(Decimal(1.325))

打印结果:

1.3249999999999999555910790149937383830547332763671875

大家看到了吗? 实际1.325用二进制转化的是有精度损失.部分小数无法完全用二进制表示.

这是根本所在.

那有的同学该说了,为什么 有的五能进1 能解释下原理吗?

原理和上边的一样,我举个例子 5可以进1

print(round(1.145,2))
#打印结果
1.15

继续查看二进制保存的值:

print(Decimal(1.145))
#打印结果
1.145000000000000017763568394002504646778106689453125

大家都明白,round本身没有问题,只是二进制保存的值有点错误导致的。

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享