`

JS精度问题

阅读更多

在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>

 

  • 大小: 8.3 KB
  • 大小: 7.5 KB
  • 大小: 8.6 KB
  • 大小: 9.3 KB
分享到:
评论

相关推荐

    decimal解决js精度问题的js文件

    decimal解决js精度问题的js文件

    js计算精度问题解决方案

    在JavaScript编程语言中,计算精度问题是一个...如果压缩包中的"js-float-accuracy-master"库提供了实用的解决方案,那么它可能包含了一些优化的算法或工具,以帮助开发者更好地处理JavaScript中的浮点数计算精度问题。

    关于javascript精度问题解决

    NULL 博文链接:https://hejie084.iteye.com/blog/1260556

    js加减乘除丢失精度问题解决方法

    代码如下: /** * 加法运算,避免数据相加小数点后产生多位数和计算精度损失。 * * @param num1加数1 | num2加数2 */ function numAdd(num1, num2) { var baseNum, baseNum1, baseNum2; try { baseNum

    js计算精度问题小结

    JavaScript中的计算精度问题源于其内部使用的是双精度浮点数(Double-precision floating-point format)进行数值计算。这种格式在存储和处理浮点数时会出现精度损失,尤其是在处理较大或较小的数字,以及进行加、减...

    js算法精度失真问题的解决方案

    为了解决上述提到的精度问题,可以通过自定义函数的方式来确保计算过程中的精度不会丢失。下面将详细介绍几种常用的方法,并提供具体的代码实现。 ##### 1. accDiv(arg1, arg2) —— 浮点数除法 此函数用于处理两...

    javascript的parseFloat()方法精度问题探讨

    在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 = ...

    Java Double 精度问题总结

    除了Java之外,在JavaScript中也会遇到类似的精度问题。一种常见的解决方案是使用 `Math.round` 函数来四舍五入结果。 ```javascript function formatFloat(src, pos) { return Math.round(src * Math.pow(10, pos...

    js Math.js bigNumber可以解决js运算精度丢失问题

    使用示例: math.config({ number:'BigNumber' }) let result=math.parser().eval(a+ "-" + b); //a,b是需要计算的值,中间是运算符

    javascript版BigDecimal类库

    总的来说,JavaScript版`BigDecimal`类库为开发者提供了一种解决JavaScript精度问题的工具,使得在进行金融计算、科学计算或其他需要高精度计算的场合下,能够得到准确的结果。通过学习和应用这个库,开发者可以更好...

    详谈javascript精度问题与调整

    在JS中数值类型就只有number类型,没有int,float,double之分,number类型实际上存储的就是IEEE754标准的浮点数,计算规则也是。 在表达式计算前,先要按照标准将两个数转成浮点数。 IEEE 754规定: 1.32位的浮点数...

    JS的高精度计算(BigDecimal)

    你是否因为JS端的小数计算的精度不足而发愁过呢 其实有个不错的资源可以利用。 引用附件的JS,就可以轻松搞定JS的计算问题了。 使用例 &lt;!-- function //+ alert(new BigDecimal("10").add(new BigDecimal("3E+...

    bigNumber.html

    bigNumber.js解决js精度问题

    javascript 四则运算精度修正函数代码

    在编写JavaScript代码进行数值计算时,经常会遇到四则运算中精度问题的困扰。这个问题尤其在涉及到浮点数运算时更为明显。浮点数在计算机中是以二进制形式存储的,由于某些小数无法精确用二进制表示,导致了运算结果...

    解决JavaScript数字精度丢失问题的方法

    JS 数字精度丢失的一些典型问题 JS 数字精度丢失的原因 解决方案(一个对象+一个函数) 一、JS数字精度丢失的一些典型问题 1. 两个简单的浮点数相加 0.1 + 0.2 != 0.3 // true 这真不是 Firebug 的问题,可以用...

    JS精度计算1、转成整数计算再转换成小数,2、toFixed,3、math.js,4、bignumber.js,5、big.js

    类似于`bignumber.js`,`big.js`也是一个轻量级的库,专注于解决JavaScript的浮点数精度问题。它提供了一个Big类,用于创建和操作大数。与`bignumber.js`相比,`big.js`的API更简单,适合对性能要求较高或不需要...

    js重写Number,解决精度问题

    js重写Number,解决精度问题

    main_half_javascript_半精度浮点数_Uint8Array_

    6. **跨平台兼容性**:需要注意的是,虽然JavaScript标准不直接支持半精度浮点数,但现代浏览器和Node.js环境中可以通过自定义函数实现。在不同平台和设备上测试代码,确保其兼容性和正确性。 7. **其他工具和库**...

Global site tag (gtag.js) - Google Analytics