python运算float浮点数精度丢失问题及解决方案

您所在的位置:网站首页 python浮点数运算解决方案 python运算float浮点数精度丢失问题及解决方案

python运算float浮点数精度丢失问题及解决方案

2023-04-06 07:15| 来源: 网络整理| 查看: 265

python运算float浮点数精度丢失问题及解决方案 精选 原创

常青猿码派 2023-03-14 16:34:22 博主文章分类:python ©著作权

文章标签 浮点数 python 双精度 文章分类 Python 后端开发 yyds干货盘点

©著作权归作者所有:来自51CTO博客作者常青猿码派的原创作品,请联系作者获取转载授权,否则将追究法律责任

问题复现3.8+3.97.699999999999999

3.8*3.914.819999999999999

精度丢失原因

这个是计算机本身的问题,不止是python会有这个问题,所有语言都会有这个问题,遵循​​ IEEE 754​​ 规范,采用双精度存储(double precision),占用64bit 浮点数在计算机中实际是以二进制保存的,有些数不精确。比如说: 0.1是十进制,转化为二进制后它是个无限循环的数:0.00011001100110011001100110011001100110011001100110011001100而python是以双精度(64)位来保存浮点数,多余的位会被截掉,所以看到的是0.1,但在电脑上实际保存的已不是精确的0.1,参与运算后,也就有可能点误差。

解决方案

方案1:先将浮点数放大倍数到整数,再进行运算,最后将结果缩小倍数。

直接上代码:

def ymul(*numbers): """ 乘积 :param numbers: eg: [1.2, 2.21, 3.141] :return: """ nums = [str(n).partition(".") for n in numbers] product = 1 place = 0 for n in nums: product *= int(f"{n[0]}{n[2]}") place += len(n[2]) r = product / 10 ** place return r

def ysum(*numbers): """ 相加, 和 :param numbers: eg: [1.2, 2.21, 3.141] :return: """ nums = [str(n).partition(".") for n in numbers] max_place = max(len(n[2].strip("-")) for n in nums) # 最大小数位 product = sum(int(f"{n[0]}{n[2].ljust(max_place, '0')}") for n in nums) r = product / 10 ** max_place return r

if __name__ == '__main__': print(ymul(3.8, 3.9)) print(ysum(3.8, 3.9))

运行结果如下:

14.827.7

不导入任何包,完美解决精度丢失的问题!!!

方案2: 使用 decimal 包解决from decimal import Decimal

Decimal("3.8") + Decimal("3.9")Decimal("3.8") * Decimal("3.9")

运行结果如下:

Decimal('7.7')Decimal('14.82')

解决!!!

收藏 评论 分享 举报

上一篇:fastapi 接口阻塞问题处理



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3