Python3 浮点数精度问题

'''
很多语言中都有浮点数数据精度的问题,Python中也是
例如:0.1 + 0.2 应该等于0.3  但结果 事实上是 0.30000000004
首先说原因:
    1、小数转换成二进制的方法:将小数部分先乘以2,记录整数部分,然后将得到的结果的小数部分乘以2,记录整数部分,直到乘法得到的结果是整数1时停止。
    实例:0.1的二进制计算方法如下
        0.1*2=0.2 0
        0.2*2=0.4 0
        0.4*2=0.8 0
        0.8*2=1.6 1
        0.6*2=1.2 1
        0.2*2=0.4 0
        0.4*2=0.8 0
        0.8*2=1.6 1
        0.6*2=1.2 1
        0.2*2=0.4 0
        0.4*2=0.8 0
        0.8*2=1.6 1
        0.6*2=1.2 1
        0.2*2=0.4 0
        0.4*2=0.8 0
        0.8*2=1.6 1
        0.6*2=1.2 1
        0.2*2=0.4 0
        0.4*2=0.8 0
        .........
        因此0.1的二进制表示是无穷的0.0001100110011001100110011
        在Python 中是以双精度(64)位来保存浮点数,多余的部分会被截取掉,因此实际0.1在Python 中存储的是 0.00011001100110011001100110011001100110011001100110011001100
        因此在参与计算的时候,我们看到的是0.1。实际上 在计算中已经不是0.1了,而是一个很长的二进制数据,所以会存在误差。
消除误差的主要方法:
1、使用round() 函数指定小数点位数
2、使用decima 配合getcontext 来指定小数点精度
'''
print(0.1 + 0.2)

# 使用round 提高精度
# 语法 round(val, num) 参数为传入的数据和指定的小数点位数
print(round(0.1 + 0.2, 3)) # 指定小数点保留的位数,当最右边存在0时,自动抹除,进位采用四舍五入
print(round(1.234, 2))
print(round(1.235, 2))

# 使用decimal 和 getcontext 提高精度
from decimal import Decimal, getcontext
print('未指定精度')
print(Decimal(0.1) + Decimal(0.2)) # 发现使用decimal 计算时,小数后面计算的更加的精确
print(Decimal(1.234) + Decimal(1.2))

print('指定精度')
getcontext().prec = 4 # 指定精度,包含非零整数部分
print(Decimal(0.1) + Decimal(0.2)) # 再次输出,小数精度会发生改变。值得注意的是,它不会抹除0
print(Decimal(1.234) + Decimal(1.2))

输出结果

0.30000000000000004
0.3
1.23
1.24
未指定精度
0.3000000000000000166533453694
2.433999999999999941380224300
指定精度
0.3000
2.434
  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haeasringnar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值