前端每日一题

20220607

0.1+0.2精度丢失问题


为什么0.1+0.2不等于0.3
可以使用BigJS的数学库来进行数据的加减
浮点数转成二进制进行加减,在转成十进制出问题了
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.0001 1001 1001 1001

0.2从十进制转成二进制
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.0011 0011 0011 0011

二进制表示浮点数

双精度浮点数第1位是符号位,第2~12位为指数位,其余52位为小数位
第1位符号位,0表示正,1表示负
第2~12位指数位(指数偏移量:2^(11-1)-1=1023),即指数可表示的范围位[-1023,1024]
剩余52位小数位:因为最终的二进制会转成科学计数法,所以整数位始终都是‘1’忽略不计,即能表示的最大数为2^(52+1)-1=9007199254740991
采用IEEEE754规范的语音都会有精度问题,可以使用BCD编码

解决小数精度丢失问题

  1. 小数取整
    采用最小单位,金额用分不用元
  2. 先升再降
    转成整数计算之后再转成小数,
    也可以用第三方库
    https://github.com/nefe/number-precision

解决大数的精度丢失问题

  1. 数字变成字符串处理
  2. BigInt
    https://github.com/GoogleChromeLabs/jsbi
    300.01优惠300元后支付金额不足0.01元
posted @ 2022-06-07 20:44  zeal666  阅读(72)  评论(0)    收藏  举报