前端每日一题
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编码
解决小数精度丢失问题
- 小数取整
采用最小单位,金额用分不用元 - 先升再降
转成整数计算之后再转成小数,
也可以用第三方库
https://github.com/nefe/number-precision
解决大数的精度丢失问题
- 数字变成字符串处理
- BigInt
https://github.com/GoogleChromeLabs/jsbi
300.01优惠300元后支付金额不足0.01元