`
greemranqq
  • 浏览: 975589 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

JS 计算 精度 问题

阅读更多

     我们经常会在页面进行数据的计算,当用javascript 进行计算的时候,有可能会出现 精度 问题!

      记录下来,让我们新手参考!

 

     我们先来分析下原因,查阅了相关资料:

      1. javascript  数字是以IEEE_754 (http://zh.wikipedia.org/zh-cn/IEEE_754)格式表示。

      2.计算的执行,我们知道都是以二进制进行操作的。

      3.至于IEEE 的详细内容在这里我就不详细解释了,简单的说就是浮点类型的数字,二进制数不能完全正确表示。

      4.同理,当我们浮点类型数字进行运算的时候,也就不能完全正确表示了。

 

      那应该如何操作呢?

      1. javascript 不是提供了Number 和 parseFloat 吗?难道不可以用吗?看看以下代码。

 

 

var a = 9.2;
var b = 4.2;
var result = Number(a)+Number(b);
alert(result);

      预期结果:13.4     实际结果:13.99999..

      如果这样呢?

 

var a = 9.2;
var b = 4.2;
var result = Number(a)+Number(b);
alert(result.toFixed(2));

      预期结果:13.40     实际结果:13.40

      好像可以了!那么这样呢?

 

var a = 0.007;
var b = 0.002;
var result = Number(a)+Number(b);
alert(result.toFixed(2));

      预计结果是:0.01

      IE    实际结果:0.00

      Chrome 实际结果:0.01  

     火狐 实际结果:0.01

      看来和浏览器内部解析和设置有关!那我们尝试下面的方法。

 

     2.扩大倍数

 

// 乘以需要保留位数加1,比如需要保留n(n=2)位 + 1,就乘1000
// 或者乘以 m,可以将所有的小数变为整数 
var a = 9.2;
var b = 4.2;
var result = Number(a*1000)+Number(b*1000);
result  = result/1000)
alert(result.toFixed(2));

      预期结果:13.40     实际结果:13.40

      好像也是可以的,但是...

 

  
var a = 0;
var b = 512.06;
var result = Number(a*100)+Number(b*100);
alert(result);
alert(result/100);
alert((result/100).toFixed(2));
 

     分别输出:51205.9999......  ,   512.06   , 512.06

     虽然计算  result 是有偏差的,但是经过还原 最终是能拿到结果的。浮点类型参与乘法运行也会失精的,看着可以,其实其实我们找到合适的数据来推翻。在这里假设:乘以一个很大的数:10000....,最后再除以,是否能得到我们满意的答案呢?也请大家给点建议,以及数据进行测试。

 

      3.字符串处理方式,思想和上面差不多

 

// num1,num2 参数,index 保留的位数
function dealNum(num1,num2,index){
	var result = 0;
	// 获得两个小数长度
	var numa = num1.toString();
	var numb = num2.toString();
	// 分别记录两数小数长度
	var lena = 0;
	var lenb = 0;
	// 最长小数的长度
	var lastLen = 0 ;
	if(numa.indexOf('.') > 0){
		lena = numa.split('.')[1].length;
	}
	if(numb.indexOf('.') > 0){
		lenb = numb.split('.')[1].length;
	}
	// 去掉小数点
	numa = numa.replace('.','');
	numb = numb.replace('.','');
	if(lena > lenb ){
		lastLen  = lena;
	}else{
		lastLen  = lenb;
	}
	// 做相应的加减乘除(这里只做加法运算,其他差不多)
	result =  Number(numa)+Number(numb);
	result = result/Math.pow(10,lastLen);
	return result.toFixed(index);
}
 

 

 

分享到:
评论

相关推荐

    js计算精度问题解决方案

    解决JavaScript计算精度问题的方法有多种: 1. **四舍五入**:使用`toFixed(n)`方法可以将数值转换为带有指定小数位数的字符串,但要注意,这并不是真正的计算,而是在结果上应用了四舍五入规则。例如,`(0.1 + 0.2...

    js计算精度问题小结

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

    JS的高精度计算(BigDecimal)

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

    JS计算精度解决方案 a-calc

    JS计算精度解决方案 a-calc

    解决javascript中的浮点数计算不精确问题

    3. **使用库**:有一些库,如提供的`DoubleCount.js`,可以帮助处理浮点数精度问题。`DoubleCount.js`可能提供了更精确的浮点数计算方法,或者提供了方便的比较和格式化工具。 ```javascript // 引入DoubleCount....

    js计算精度

    js计算精度

    javascript避免数字计算精度误差的方法详解.docx

    ### JavaScript避免数字计算精度误差的方法详解 #### 一、引言 在JavaScript中进行浮点数运算时,经常会出现精度误差的问题。...希望本文能帮助大家更好地理解和解决JavaScript中的浮点数计算精度问题。

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

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

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

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

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

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

    封装mathjs的文件,用于解决js的精度问题导致的计算bug

    封装mathjs的文件,用于解决js的精度问题导致的计算bug

    decimal.js是使用的二进制来计算的, 所以能解决js的精度问题

    1.js有精度问题, 对于一些金额的计算就总是与偶莫名其妙的问题 2.decimal.js是使用的二进制来计算的, 所以能解决js的精度问题

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

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

    java和js的计算精度的实现

    在金额的加减乘除运算时我们往往会忽略计算结果的精度问题,导致莫名奇妙出现了过多的小数位,这在我做银行项目时尤其需要关注的一个问题点。 其实在我们使用正常的 + - * / 运算时,在某些情况下就会出现精度丢失...

    JavaScript小数点精确计算

    在实际开发中,根据具体需求,结合以上策略,可以有效解决精度问题,实现准确的计算。在处理金融、统计等对精度要求高的场景时,特别需要注意这个问题。通过学习和掌握这些知识,能够提升JavaScript应用程序的准确性...

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

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

    Java Double 精度问题总结

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

    解决JS浮点数(小数)计算加减乘除的BUG

    2. **使用库**:有些库如`decimal.js`或`big.js`专门用于处理高精度浮点数计算,它们可以避免JavaScript内置的浮点数精度问题。 3. **整数运算**:对于涉及金钱计算等需要精确结果的场景,可以考虑将数值转换为整数...

    javascript避免数字计算精度误差的方法详解

    这种方法通过消除小数点来处理精度问题,确保了数字在计算过程中以整数形式参与运算,从而避免了二进制小数运算的精度问题。 通过以上内容,我们可以了解到JavaScript中处理数字精度误差的几种方法,包括使用现有的...

Global site tag (gtag.js) - Google Analytics