小数精度损失问题,如何导致,如何解决

2019-09-27  本文已影响0人  一介书生_1861

问题描述

提取一个浮点数的每一位出现了精度损失。
代码:

a = 56.76
bit_1 = int(a/10)
a = a % 10
bit_2 = int(a/1)
a = a % 1
bit_3 = int(a/0.1)
a = a % 0.1
bit_4 = int(a/0.01)
print(bit_1,bit_2,bit_3,bit_4)

结果为:5 6 7 5

很奇怪,结果应该是5 6 7 6,最后一位却变成了5。
我们逐行打印结果来一探究竟

>>> a = 56.76
>>> a = a % 10
>>> a
6.759999999999998 

相信看到这里大家就明白了,原来是使用浮点数导致的精度问题。

解决方案

使用round()方法发将精度较高的浮点数四舍五入为精度较低的浮点数即可。

>>> a
6.759999999999998
>>> a = round(a,2)
>>> a
6.76

每一次对a进行取模运算后,矫正一次小数位数

a = 56.76
bit_1 = int(a/10)
a = a % 10
a = round(a,2)
bit_2 = int(a/1)
a = a % 1
a = round(a,2)
bit_3 = int(a/0.1)
a = a % 0.1
a = round(a,2)
bit_4 = int(a/0.01)
print(bit_1,bit_2,bit_3,bit_4)

5 6 7 6 #得到正确结果

如果确实需要超过17位的精度,可以使用decimal模块配合getcontext方法。

版权声明:本文为CSDN博主「书亚shua」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40680263/article/details/99312833

上一篇 下一篇

猜你喜欢

热点阅读