在JS处理算法时,有时会存在精度问题。
如694.84+(-300)有精度问题,但694.64+(-300)没有精度问题。
如0.263*256.3有精度问题,但0.263*256.5没有精度问题。
但在实际应用中,是绝对不能出现此类问题的。如下提供了一种解决此类精度问题的方法,供参考。
<html> <head></head> <script> /** * * 浮点数乘法运算 * * @param {number} arg1 乘数 * @param {number} arg2 被乘数 * * @example * Math.floatMul(11.1, 77.7) * 其形式等同于 (11.1 * 77.7) 但不存在 JS 丢失精度的问题 * 如3.69 * 258.258 */ Math.floatMul = function(arg1, arg2) { var m=0, s1=arg1.toString(), s2=arg2.toString(); try{ m += s1.split(".")[1].length; } catch(e){} try{ m += s2.split(".")[1].length; } catch(e){} //alert(s1 + '|||' + s2); return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m); }; /** * 浮点数加法运算 * * @param {number} arg1 加数 * @param {number} arg2 被加数 * * @example * Math.floatAdd(11.1, 77.7) * 其形式等同于 (11.1 + 77.7) 但不存在 JS 丢失精度的问题 * 如694.84 + (-300) */ Math.floatAdd = function(arg1, arg2) { var r1, r2, m; try{ r1 = arg1.toString().split(".")[1].length; } catch(e) { r1 = 0; } try{ r2 = arg2.toString().split(".")[1].length; } catch(e) { r2 = 0; } m = Math.pow(10, Math.max(r1, r2)); return ((arg1 * m) + (arg2 * m)) / m; }; /** * 直接乘 */ function directMul(){ var v1 = document.getElementById('txt1').value; var v2 = document.getElementById('txt2').value; var v = parseFloat(v1) * parseFloat(v2); alert(v1 + ' * ' + v2 + ' = ' + v); } /** * 帮助方法乘 */ function helpMul(){ var v1 = document.getElementById('txt1').value; var v2 = document.getElementById('txt2').value; var v = Math.floatMul(parseFloat(v1), parseFloat(v2)); alert(v1 + ' * ' + v2 + ' = ' + v); } /** * 直接加 */ function directAdd(){ var v1 = document.getElementById('txt1').value; var v2 = document.getElementById('txt2').value; var v3 = parseFloat(v1) + parseFloat(v2); alert(v1 + ' + ' + v2 + ' = ' + v3); } /** * 帮助方法加 */ function helpAdd(){ var v1 = document.getElementById('txt1').value; var v2 = document.getElementById('txt2').value; v = Math.floatAdd(parseFloat(v1), parseFloat(v2)); alert(v1 + ' + ' + v2 + ' = ' + v); } /** * 条件修改 */ function conditionModify(){ var v1 = document.getElementById('txt1').value; var v2 = document.getElementById('txt2').value; var b = compareModifyValIsIncluded({ normVal : v1 , modifyVal : v2 , minScale : -0.4 , maxScale : 0.3 }); //alert(b); if(b) { document.getElementById('txt1').value = v2; } } /** * 判断原值是否在修改的范围内,如在范围内,返回true;如不在范围内,返回false */ var compareModifyValIsIncluded = function (includeParamObj){ if(theParamsIsNaN(includeParamObj.normVal, includeParamObj.modifyVal)) { return false; } if(theParamsIsNaN(includeParamObj.minScale, includeParamObj.maxScale)) { return false; } // 原值 var normVal = parseFloat(includeParamObj.normVal); // 预修改后的值 var modifyVal = parseFloat(includeParamObj.modifyVal); // 修改上限 var maxScale = parseFloat(includeParamObj.maxScale); // 修改下限 var minScale = parseFloat(includeParamObj.minScale); var maxVal = Math.floatMul(normVal, 1 + maxScale); var mixVal = Math.floatMul(normVal, 1 + minScale); //alert('maxScale:' + maxScale + ' || minScale:' + minScale); //alert(normVal + 'maxVal:' + maxVal + '||mixVal' + mixVal); if(modifyVal < mixVal || modifyVal > maxVal) { return true; } return false; } var theParamsIsNaN = function (){ for(var i = 0 ; i < arguments.length ; i++){ if(isNaN(arguments[i])) { return true; } } return false; } </script> <body> <input id="txt1" /><br/> <input id="txt2" /><br/> <input type="button" value="直接乘" onclick="directMul()" /> <input type="button" value="帮助方法乘" onclick="helpMul()" /> <input type="button" value="直接加" onclick="directAdd()" /> <input type="button" value="帮助方法加" onclick="helpAdd()" /> <input type="button" value="条件修改" onclick="conditionModify()" /> </body> </html>
相关推荐
decimal解决js精度问题的js文件
js精度,js浮点数,js浮点数计算,js计算精度问题解决方案,js保留小数位,
NULL 博文链接:https://hejie084.iteye.com/blog/1260556
在Javascript中parseFloat()方法会产生精度问题 代码如下: [removed] var a = “0.11”; var b = “0.2801”; var c = “1.002”; var sum1 = parseFloat(a) + parseFloat(b) + parseFloat(c); var sum2 = ...
代码如下://问题比如:7*0.8 JavaScript算出来就是:5.6000000000000005 //加法函数,用来得到精确的加法结果 //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的...
关于在javascript中数字运算时,精度值问题
使用示例: math.config({ number:'BigNumber' }) let result=math.parser().eval(a+ "-" + b); //a,b是需要计算的值,中间是运算符
代码如下: /** * 加法运算,避免数据相加小数点后产生多位数和计算精度损失。 * * @param num1加数1 | num2加数2 */ function numAdd(num1, num2) { var baseNum, baseNum1, baseNum2; try { baseNum
下面小编就为大家带来一篇详谈javascript精度问题与调整。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
你是否因为JS端的小数计算的精度不足而发愁过呢 其实有个不错的资源可以利用。 引用附件的JS,就可以轻松搞定JS的计算问题了。 使用例 <!-- function //+ alert(new BigDecimal("10").add(new BigDecimal("3E+...
bigNumber.js解决js精度问题
JS 数字精度丢失的一些典型问题 JS 数字精度丢失的原因 解决方案(一个对象+一个函数) 一、JS数字精度丢失的一些典型问题 1. 两个简单的浮点数相加 0.1 + 0.2 != 0.3 // true 这真不是 Firebug 的问题,可以用...
JS预算精度问题确实很麻烦,这个能解决一些问题,虽然有bug.
js重写Number,解决精度问题
封装mathjs的文件,用于解决js的精度问题导致的计算bug
众所周知,数字运算的精度问题是一个让人很旦疼的问题,而java中有BigDecimal类对数字精度问题进行处理,经过一番查询,发现前段有一个宝藏精度处理类bignumber。亲测好用。 众所周知,数字运算的精度问题是一个让人...
js计算精度
1.js有精度问题, 对于一些金额的计算就总是与偶莫名其妙的问题 2.decimal.js是使用的二进制来计算的, 所以能解决js的精度问题