1.2345保留三位小数为什么是1.234 , 而1.23456保留三位小数是1.235

来源:8-1 认识函数

东风码头

2018-08-28

写回答

2回答

EnzoLiu

2018-08-29

a = 1.2345
b = 1.23456
c = 1.2335

print(str(a) + "取后三位结果: " + str(round(a, 3)))
print(str(b) + "取后三位结果: " + str(round(b, 3)))
print(str(c) + "取后三位结果: " + str(round(c, 3)))

运行结果:

1.2345取后三位结果: 1.234

1.23456取后三位结果: 1.235

1.2335取后三位结果: 1.234

-------------------------------------------分隔符-------------------------------------------

发现python3并没有进行四舍五入,为什么呢?

去翻阅python3的文档,有这么一段话:

values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done toward the even choice.

大概意思是:如果距离两边一样远,会保留到偶数的一边。

比如round(0.5)和round(-0.5)都会保留到0,而round(1.5)会保留到2

那么根据这个解释来讲,a b c的结果都应该是1.234的,但目前就a和c取值正确,b为啥会出现1.235呢?继续往下看


文档里面还写到:

The behavior of round() for floats can be surprising: for example, round(2.675, 2) gives 2.67 instead of the expected 2.68. This is not a bug: it’s a result of the fact that most decimal fractions can’t be represented exactly as a float. 

大概意思是:这不是个bug,而是大部分情况下小数部分转成二进制后会丢失精度。

例如:计算机将1.23456转成二进制,这时候二进制比1.23456略大一丢丢 ... (比如1.23456000000000001)

计算机不得不将第四位小数进一处理,导致出现了现在的结果:1.2345

-------------------------------------------分隔符-------------------------------------------

再看如下代码:

a = 1.23450000000000
b = 1.23450000000001
c = 1.23449999999999

print(str(a) + "取后三位结果: " + str(round(a, 3)))
print(str(b) + "取后三位结果: " + str(round(b, 3)))
print(str(c) + "取后三位结果: " + str(round(c, 3)))

可以不去执行,先自己猜一下结果,然后再去验证

先记住“如果距离两边一样远,会保留到偶数的一边。”这句话,然后往下看:

a:

小数第三位往后的值是 0.0005,如果第三位是偶数则丢弃,是奇数则进一,最后发现第三位小数是4,属于偶数。结果是:1.234


b:

小数第三位往后的值是 0.00050000000001,并不满足距离两边一样远,进一。结果应该是1.235


c:

小数第三位往后的值是 0.00049999999999,并不满足距离两边一样远,舍弃,结果应该是1.234


执行这段python代码,运行结果:

1.2345取后三位结果: 1.234

1.23450000000001取后三位结果: 1.235

1.23449999999999取后三位结果: 1.234


如果对精度要求不大,可以用round函数,但如果有四舍五入的需求且对精度要求高,可以考虑decimal模块。

decimal模块基础用法 参考:https://blog.csdn.net/ztf312/article/details/76578046

1
0

EnzoLiu

2018-08-29

提问问题请把相关的代码贴出来,这样别人才能根据你的代码来帮你。

0
2
EnzoLiu
回复
7七月
哈哈,谢谢七月老师给予的肯定。
2018-08-30
共2条回复

Python3.8系统入门+进阶 (程序员必备第二语言)

语法精讲/配套练习+思考题/原生爬虫实战

14598 学习 · 4469 问题

查看课程