关键字: javascript 浮点数 小数 运算 精度问题
JavaScript小数在做四则运算时,精度会丢失,这会在项目中引起诸多不便,先请看下面脚本:
# <script type="text/javascript" language="javascript">
# alert(1/3);//弹出: 0.3333333333333333
# alert(0.09999999 + 0.00000001);//弹出: 0.09999999999999999
# alert(-0.09999999 - 0.00000001);//弹出: -0.09999999999999999
# alert(0.012345 * 0.000001);//弹出: 1.2344999999999999e-8
# alert(0.000001 / 0.0001);//弹出: 0.009999999999999998
# </script>
按正常计算的话,除第一行外(因为其本身就不能除尽),其他都应该要得到精确的结果,从弹出的结果我们却发现不是我们
想要的正确结果。为了解决浮点数运算
不准确的问题,在运算前我们把参加运算的数先升级(10的X的次方)到整数,等运算完
后再降级(0.1的X的次方)。现收集并整理贴于此,以备后用。
加法
//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
//调用:accAdd(arg1,arg2)
//返回值:arg1加上arg2的精确结果
function accAdd(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
}
//给Number类型增加一个add方法,调用起来更加方便。
Number.prototype.add = function (arg){
return accAdd(arg,this);
}
减法
//说明:javascript的减法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的减法结果。
//调用:accSub(arg1,arg2)
//返回值:arg1减上arg2的精确结果
function accSub(arg1,arg2){
return accAdd(arg1,-arg2);
}
//给Number类型增加一个sub方法,调用起来更加方便。
Number.prototype.sub = function (arg){
return accSub(this,arg);
}
乘法
//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
//调用:accMul(arg1,arg2)
//返回值:arg1乘以arg2的精确结果
function accMul(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){}
return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)
}
//给Number类型增加一个mul方法,调用起来更加方便。
Number.prototype.mul = function (arg){
return accMul(arg, this);
}
除法
//说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
//调用:accDiv(arg1,arg2)
//返回值:arg1除以arg2的精确结果
function accDiv(arg1,arg2){
var t1=0,t2=0,r1,r2;
try{t1=arg1.toString().split(".")[1].length}catch(e){}
try{t2=arg2.toString().split(".")[1].length}catch(e){}
with(Math){
r1=Number(arg1.toString().replace(".",""))
r2=Number(arg2.toString().replace(".",""))
return (r1/r2)*pow(10,t2-t1);
}
}
//给Number类型增加一个div方法,调用起来更加方便。
Number.prototype.div = function (arg){
return accDiv(this, arg);
}
分享到:
相关推荐
### JavaScript避免数字计算精度误差的方法详解 #### 一、引言 在JavaScript中进行浮点数运算时,经常会出现精度误差的问题。例如,一个简单的加法运算 `0.1 + 0.2` 的结果并不是预期中的 `0.3`,而是 `0....
解决JavaScript计算精度问题的方法有多种: 1. **四舍五入**:使用`toFixed(n)`方法可以将数值转换为带有指定小数位数的字符串,但要注意,这并不是真正的计算,而是在结果上应用了四舍五入规则。例如,`(0.1 + 0.2...
6. **使用其他编程语言**:如果项目允许,可以使用像Java、Python等支持任意精度计算的语言进行计算,然后将结果传递给JavaScript。 总结来说,JavaScript的小数点精确计算需要开发者理解其底层机制,选择合适的...
标题所提到的知识点是关于在JavaScript编程语言中,如何处理和避免在进行数字计算时出现的精度误差问题。这个问题是数字在以浮点数形式存储时,因为计算机的存储架构是以二进制为基础的,导致一些十进制小数在二进制...
本文还对JavaScript语言在主流浏览器(Firefox、Chrome、360等)上的计算性能进行了研究,发现JavaScript语言在主流浏览器上的计算精度与计算速度无明显区别,可以在实验测试中替换使用。 本文对JavaScript语言的...
它使用BigNumber类型来处理大数和高精度计算,从而避免了JavaScript浮点数精度问题。例如,`math.bignumber('1234567890.123456789')`可以创建一个大数对象,之后的计算都会保持高精度。 4. **bignumber.js库** `...
在JavaScript编程语言中,精确计算是一项重要的需求,特别是在金融、科学计算或任何需要高精度数值操作的场景。由于JavaScript的内置Number类型使用浮点数表示,这可能导致在进行大数运算时出现微小的误差。标题...
### JavaScript小数精度...这些函数可以应用于各种场景下的浮点数运算,特别是在金融和统计等需要高精度计算的领域中尤为重要。开发者可以根据实际需求选择合适的函数来优化自己的代码,从而提高应用的准确性和可靠性。
代码如下: /** * 加法运算,避免数据相加小数点后产生多位数和计算精度损失。 * * @param num1加数1 | num2加数2 */ function numAdd(num1, num2) { var baseNum, baseNum1, baseNum2; try { baseNum
在JavaScript中,处理二进制数据流是常见的需求,特别是在科学计算、图形处理或网络通信等领域。`Uint8Array`是JavaScript中用于处理字节数组的类型,它提供了一种高效的方式来访问和操作二进制数据。然而,...
总的来说,JavaScript版`BigDecimal`类库为开发者提供了一种解决JavaScript精度问题的工具,使得在进行金融计算、科学计算或其他需要高精度计算的场合下,能够得到准确的结果。通过学习和应用这个库,开发者可以更好...
在JavaScript编程中,浮点数计算不精确是一个常见的问题,源于其内部的二进制浮点数表示方式。本文将深入探讨这个问题,并提供解决方案。首先,我们要理解为什么会出现这种不精确性。 JavaScript遵循IEEE 754标准来...
在JavaScript和jQuery中,精度计算通常涉及到数字的四舍五入和保留小数位数的操作。这在处理货币、百分比或任何需要精确数值表示的数据时尤为重要。`toFloat`函数是一个自定义的jQuery方法,用于将HTML元素中的数值...
3. **使用特定库**:有一些JavaScript库,如`decimal.js`或`big.js`,专门用于处理高精度浮点数计算。这些库内部使用大整数算法,能够确保计算的精确性。 根据提供的文件名`FloatCumulateV1.html`和`js`,我们可以...
JS计算精度解决方案 a-calc
理解这个问题对于编写高精度计算或金融类应用至关重要,因为在这些场景下,即使微小的精度差异也可能导致严重后果。为确保精确计算,开发人员可以考虑使用BigInt,或者依赖专门的库来处理大数和高精度计算。
减法运算函数Subtr首先计算两个参数的小数位数,然后将较大的小数位数作为最终位数n,将参数放大至这个位数,执行减法运算后,通过toFixed(n)方法将结果保留到相应的小数位数,以确保减法的精度。 除法函数accDiv的...
在实际开发过程中,当遇到JavaScript中的小数运算精度问题时,可以通过使用上述的方法来保证运算结果的精度。需要注意的是,尽管这些方法可以解决大部分精度问题,但可能会引入额外的计算量,从而影响程序的性能。...
在JavaScript编程中,开发者经常会使用到parseFloat()方法,这个方法能够将字符串转换为浮点数。...通过上述方法,可以有效地解决JavaScript中parseFloat()方法的精度问题,确保程序的计算结果准确无误。