python和js小数计算精度问题处理

TIM截图20191022173712.png

问题举例

数字计算由于数据结构底层问题,导致会某些情况下存在精度丢失问题,JavaScript也存在同类问题,可以使用decimal.js库,用法与python相似

image.png

In [5]: 0.1+0.1+0.1 Out[5]: 0.30000000000000004 In [13]: 0.1*3 Out[13]: 0.30000000000000004

解决方法

使用python内建库decimal可以进行准确的计算

image.png

# 错误用法: In [15]: decimal.Decimal(0.1) * 3 Out[15]: Decimal('0.3000000000000000166533453694') In [18]: decimal.Decimal(str(0.1 * 3)) Out[18]: Decimal('0.30000000000000004') # 正确用法: In [20]: decimal.Decimal('0.1') * 3 Out[20]: Decimal('0.3') In [21]: decimal.Decimal('0.1') * decimal.Decimal('3') Out[21]: Decimal('0.3') # 错误用法: In [23]: decimal.Decimal(0.1) + decimal.Decimal(0.1)  + decimal.Decimal(0.1) Out[23]: Decimal('0.3000000000000000166533453694') # 正确用法: In [24]: decimal.Decimal(str(0.1)) + decimal.Decimal(str(0.1))  + decimal.Decimal(str(0.1)) Out[24]: Decimal('0.3')

注意:小数计算时必须先转换为Decimal类型,且必须先转为为字符串传参,否则使用float类型传入的Decimal数已经是丢失精度,将失去使用Decimal的作用

精度和进位

quantize()方法可实现保留多少位小数操作,第一个参数为保留多少位,比如’0’不保留小数,'0.00’保留两位小数

image.png

# 四舍五入: In [43]: decimal.Decimal(123.214).quantize(decimal.Decimal('.00'), decimal.ROUND_HALF_UP) Out[43]: Decimal('123.21') In [44]: decimal.Decimal(123.215).quantize(decimal.Decimal('.00'), decimal.ROUND_HALF_UP) Out[44]: Decimal('123.22') # 始终不进位 In [45]: decimal.Decimal(123.214).quantize(decimal.Decimal('.00'), decimal.ROUND_DOWN) Out[45]: Decimal('123.21') In [46]: decimal.Decimal(123.215).quantize(decimal.Decimal('.00'), decimal.ROUND_DOWN) Out[46]: Decimal('123.21') # 始终进位 In [47]: decimal.Decimal(123.214).quantize(decimal.Decimal('.00'), decimal.ROUND_UP) Out[47]: Decimal('123.22') In [48]: decimal.Decimal(123.215).quantize(decimal.Decimal('.00'), decimal.ROUND_UP) Out[48]: Decimal('123.22')

常用进位方式:

进位标志描述
decimal.ROUND_HALF_EVEN默认值,有些情况下和四舍五入效果一样,但不完全一样,一般还是使用下面四舍五入方法
decimal.ROUND_HALF_UP四舍五入
decimal.ROUND_UP始终进位
decimal.ROUND_DOWN始终不进位

服务推荐

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值