我们经常会在页面进行数据的计算,当用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);
}
分享到:
相关推荐
解决JavaScript计算精度问题的方法有多种: 1. **四舍五入**:使用`toFixed(n)`方法可以将数值转换为带有指定小数位数的字符串,但要注意,这并不是真正的计算,而是在结果上应用了四舍五入规则。例如,`(0.1 + 0.2...
JavaScript中的计算精度问题源于其内部使用的是双精度浮点数(Double-precision floating-point format)进行数值计算。这种格式在存储和处理浮点数时会出现精度损失,尤其是在处理较大或较小的数字,以及进行加、减...
你是否因为JS端的小数计算的精度不足而发愁过呢 其实有个不错的资源可以利用。 引用附件的JS,就可以轻松搞定JS的计算问题了。 使用例 <!-- function //+ alert(new BigDecimal("10").add(new BigDecimal("3E+...
JS计算精度解决方案 a-calc
3. **使用库**:有一些库,如提供的`DoubleCount.js`,可以帮助处理浮点数精度问题。`DoubleCount.js`可能提供了更精确的浮点数计算方法,或者提供了方便的比较和格式化工具。 ```javascript // 引入DoubleCount....
js计算精度
### JavaScript避免数字计算精度误差的方法详解 #### 一、引言 在JavaScript中进行浮点数运算时,经常会出现精度误差的问题。...希望本文能帮助大家更好地理解和解决JavaScript中的浮点数计算精度问题。
代码如下: /** * 加法运算,避免数据相加小数点后产生多位数和计算精度损失。 * * @param num1加数1 | num2加数2 */ function numAdd(num1, num2) { var baseNum, baseNum1, baseNum2; try { baseNum
使用示例: math.config({ number:'BigNumber' }) let result=math.parser().eval(a+ "-" + b); //a,b是需要计算的值,中间是运算符
为了解决上述提到的精度问题,可以通过自定义函数的方式来确保计算过程中的精度不会丢失。下面将详细介绍几种常用的方法,并提供具体的代码实现。 ##### 1. accDiv(arg1, arg2) —— 浮点数除法 此函数用于处理两...
封装mathjs的文件,用于解决js的精度问题导致的计算bug
1.js有精度问题, 对于一些金额的计算就总是与偶莫名其妙的问题 2.decimal.js是使用的二进制来计算的, 所以能解决js的精度问题
类似于`bignumber.js`,`big.js`也是一个轻量级的库,专注于解决JavaScript的浮点数精度问题。它提供了一个Big类,用于创建和操作大数。与`bignumber.js`相比,`big.js`的API更简单,适合对性能要求较高或不需要...
在金额的加减乘除运算时我们往往会忽略计算结果的精度问题,导致莫名奇妙出现了过多的小数位,这在我做银行项目时尤其需要关注的一个问题点。 其实在我们使用正常的 + - * / 运算时,在某些情况下就会出现精度丢失...
在实际开发中,根据具体需求,结合以上策略,可以有效解决精度问题,实现准确的计算。在处理金融、统计等对精度要求高的场景时,特别需要注意这个问题。通过学习和掌握这些知识,能够提升JavaScript应用程序的准确性...
JS 数字精度丢失的一些典型问题 JS 数字精度丢失的原因 解决方案(一个对象+一个函数) 一、JS数字精度丢失的一些典型问题 1. 两个简单的浮点数相加 0.1 + 0.2 != 0.3 // true 这真不是 Firebug 的问题,可以用...
除了Java之外,在JavaScript中也会遇到类似的精度问题。一种常见的解决方案是使用 `Math.round` 函数来四舍五入结果。 ```javascript function formatFloat(src, pos) { return Math.round(src * Math.pow(10, pos...
2. **使用库**:有些库如`decimal.js`或`big.js`专门用于处理高精度浮点数计算,它们可以避免JavaScript内置的浮点数精度问题。 3. **整数运算**:对于涉及金钱计算等需要精确结果的场景,可以考虑将数值转换为整数...
这种方法通过消除小数点来处理精度问题,确保了数字在计算过程中以整数形式参与运算,从而避免了二进制小数运算的精度问题。 通过以上内容,我们可以了解到JavaScript中处理数字精度误差的几种方法,包括使用现有的...