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

问题描述

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

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容