javascript浮点数及详细运算精度调整

javascript浮点数及详细运算精度调整
Javascript的只有一种类型的数字型数,并在Javascript中所有的数字都在IEEE-754标准格式表示,浮点数的准确性问题不是Javascript独特的,因为在二进制表示的十进制数是无限的了。
十进制二进制

0.1 0.0001100110011001…

0.2 0.0011001100110011…

0.3 0.0100110011001100…

0.4 0.0110011001100110…

0.5 0.1

0.6 0.1001100110011001…
例如,1.1,它的程序不能真正表达1.1,但它只能达到一定的精度,这是不可避免的精度损失:1.0999999999999999。
Javascript中的问题比较复杂,这里只给出了一些测试数据:

console.log(1.0-0.9 = = 0.1) / /假
Console.log (1.0-0.8 = = 0.2) //false
console.log(1.0-0.7 = = 0.3) / /假
console.log(1.0-0.6 = = 0.4) / /真的
Console.log (1.0-0.5 = = 0.5) //true
console.log(1.0-0.4 = = 0.6) / /真的
console.log(1.0-0.3 = = 0.7) / /真的
console.log(1.0-0.2 = = 0.8) / /真的
console.log(1.0-0.1 = = 0.9) / /真的
你如何避免这种1.0-0.9!= 0.1非bug问题下面给出了一个更广泛使用的解决方案。在判断浮点数运算结果之前,计算的精度会被缩小,因为在减少精度的过程中,总有四轮五个条目。

(1.0-0.9)。ToFixed(位)定(位) / /精度参数应在0和20之间
console.log(parseFloat((1.0-0.9)。ToFixed(10))= 0.1 / /真实)
console.log(parseFloat((1.0-0.8)。ToFixed(10))= 0.2 / /真实)
console.log(parseFloat((1.0-0.7)。ToFixed(10))= 0.3 / /真实)
console.log(parseFloat((11.0-11.8)。ToFixed(10))= = = 0.8) / /真的
写一条路:

确定的值等于 / /相等的方法
(number1,number2函数相等,数字){
数字=数字=未定义的10:数字;默认精度为10。
返回number1.tofixed(位数)= number2.tofixed(数字);
}
console.log(相等(1.0-0.7,0.3)); / /真的
原型/扩展模式,更爱面向对象的风格
number.prototype.isequal =功能(号码位数){
数字=数字=未定义的10:数字;默认精度为10。
返回this.tofixed(位数)= number.tofixed(数字);
}
Console.log((1.0-0.7)。IsEqual(0.3)); / /真的
接下来,尝试一下浮点数的运算。

console.log(1.79 + 0.12) / / 1.9100000000000001
console.log(2.01-0.12) / / 1.8899999999999997
console.log(1.01×1.3) / / 1.3130000000000002
console.log(0.69 / 10) / / 0.0689999999999999
解uff1a

+加函数,用于获得准确的加法结果
说明:Javascript添加结果会出现错误,当两个浮在一起时会更明显。这个函数返回更精确的加法结果。
/ /电话:accadd(arg1,arg2)
/ /返回值:ARG1加arg2准确的结果
功能accadd(arg1,arg2){
var,R2,m;
尝试{ R1 = arg1.tostring(Split()。{){ 1 } }长度捕获(e){ = 0 }
尝试{ R2 = arg2.tostring(Split()。{){ 1 } }长度捕获(e){ = 0 }
M = math.pow(10、Math.max(R1,R2))
返回(arg1 * M + 2×m)/ m
}
一种增加加号类型的方法,更方便调用。
number.prototype.add =功能(arg){
返回accadd(Arg,这个);
}

减法函数,减法得到准确的结果
说明:Javascript添加结果会出现错误,当两个浮在一起时会更明显。这个函数返回一个更精确的减法的结果。
/ /电话:accsub(arg1,arg2)
/ /返回值:ARG1减去2准确的结果
功能accsub(arg1,arg2){
var,R2,m,n;
尝试{ R1 = arg1.tostring(Split()。{){ 1 } }长度捕获(e){ = 0 }
尝试{ R2 = arg2.tostring(Split()。{){ 1 } }长度捕获(e){ = 0 }
M = math.pow(10、Math.max(R1,R2));
/ /最后修改的deeka
动态控制精度长度
N(= R2 = R2);
返回(((arg1 * m-arg2×m)/ M)ToFixed(N);
}
得到精确的除法/函数除法结果
说明:Javascript /除法结果会出现错误,当两个浮点除法更为明显时,这个函数返回一个更精确的除法结果。
/ /电话:accdiv(arg1,arg2)
/ /返回值:准确的结果除以2 arg1
功能accdiv(arg1,arg2){
var t1 = 0,T2 = 0,R1,R2;
尝试{ T1 = arg1.tostring(。分)(。){ 1 }。长度}赶上(e){ }
尝试{ T2 = arg2.tostring(。分)(。){ 1 }。长度}赶上(e){ }
用(数学){
R1 =数(arg1.tostring()。更换(,
R2 =数(arg2.tostring()。更换(,
返回(R1和R2)* pow(10,T2-T1);
}
}
一种增加div数类型的方法,更方便调用。
number.prototype.div =功能(arg){
返回accdiv(这,Arg);
}

熟悉乘法函数,精确乘法
说明:当两个浮点乘法更为明显时,将出现错误,此函数返回更精确的乘法结果。
/ /电话:accmul(arg1,arg2)
/ /返回值:ARG1乘以2准确的结果
功能accmul(arg1,arg2){
var m = 0,S1,S2 = = arg1.tostring()()arg2.tostring;
尝试{ M + = s1.split(,){ 1 }。长度}赶上(e){ }
尝试{ M + = s2.split(,){ 1 }。长度}赶上(e){ }
回数(s1.replace(。
}
一种提高多 /数字型的方法,调用起来更方便。
number.prototype.mul =功能(arg){
返回accmul(Arg,这个);
}
检查
console.log(accadd(1.79,0.12)); / / 1.91
console.log(accsub(2.01,0.12)); / / 1.89
console.log(accdiv(0.69,10)); / / 0.069console.log(accmul(1.01,1.3)); / / 1.313
装修后,可以愉快地运行操作~加、减、乘、除的内容,希望对大家有所帮助,希望大家支持
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部