当前位置: 首页 > Web前端 > vue.js

js精度损失的解决方法

时间:2023-03-31 15:03:55 vue.js

是一个很简单的问题,0.1+0.2,我们可以看到它等于0.3,但是js是一门神奇的语言,我们在控制台输入0.1+0.2等于0.30000000000000004,为什么会这样,我google了一下,原因如下:JavaScript中的所有数字,包括整数和小数,只有一种类型——Number。其实现遵循IEEE754标准,采用64位定长表示,即标准的double双精度浮点数(也有32位单精度float)。二进制值0.1表示无限循环的小数。这个版本的JS使用浮点数标准,需要截取这种无限循环的二进制,导致精度损失,导致0.1不再是0.1。拦截后,0.1变成了0.100...001,0.2变成了0.200...002。所以两者之和大于0.3。原因是它太奇怪了。在提出涉及数字计算的需求时,需要解决老人的问题。解决这个问题,我一般是打包成一个文件,在后面需要的模块里导入,使用1.判断obj是否为整数exportconstisInteger=(obj)=>{returnMath.floor(obj)===obj//向下舍入是为了保留整数部分,截取不变}2.转换一个浮点数Integer,返回整数和倍数如:3.14-->314,倍数为100,floatNum{number}十进制,返回一个对象,{times:100,num:314}exportconsttoInteger=(floatNum)=>{varret={times:1,num:0};如果(isInteger(floatNum)){ret.num=floatNum;returnret}//1.//转字符串varstrfi=floatNum+'';//2.//获取小数点为vardotPos=strfi.indexOf('.');//3。//截取需要的长度varlen=strfi.substr(dotPos+1).length;//4。倍数是长度的幂vartimes=Math.pow(10,len);varintNum=parseInt(floatNum*times,10);ret.times=次;ret.num=intNum;returnret}3.将小数放大为整数(乘法),进行算术运算,再化为小数(除法)参数:a{number}操作数1b:{number}操作数2,op{string}运算类型,包括加减乘除(add/subtract/multiply/divide)exportconstoperation=(a,b,op)=>{varo1=toInteger(a);varo2=至整数(b);varn1=o1.num;varn2=o2.num;vart1=o1.times;vart2=o2.times;最大变量=t1>t2?t1:t2;(op){case'add':if(t1===t2){//两位小数相同结果=n1+n2}elseif(t1>t2){//o1小数位大于o2结果=n1+n2*(t1/t2)}else{//o1小数位小于o2result=n1*(t2/t1)+n2}returnresult/max;case'subtract':if(t1===t2){result=n1-n2}elseif(t1>t2){result=n1-n2*(t1/t2)}else{result=n1*(t2/t1)-n2}返回结果/最大值;case'multiply':结果=(n1*n2)/(t1*t2);返回结果;case'divide':结果=(n1/n2)*(t2/t1);返回结果}}