JavaScript小数在做四则运算时,精度会丢失,这会在项目中引起诸多不便,先请看下面脚本:
Js代码
# <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>
# <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的次方)。现收集并整理贴于此,以备后用。
加法
Js代码
//说明: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的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
//调用: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);
}
减法
Js代码
//说明: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的减法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的减法结果。
//调用:accSub(arg1,arg2)
//返回值:arg1减上arg2的精确结果
function accSub(arg1,arg2){
return accAdd(arg1,-arg2);
}
//给Number类型增加一个sub方法,调用起来更加方便。
Number.prototype.sub = function (arg){
return accSub(this,arg);
}
乘法
Js代码
//说明: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的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
//调用: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);
}
除法
Js代码
//说明: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....
6. **使用其他编程语言**:如果项目允许,可以使用像Java、Python等支持任意精度计算的语言进行计算,然后将结果传递给JavaScript。 总结来说,JavaScript的小数点精确计算需要开发者理解其底层机制,选择合适的...
这类库通常会提供专门的算法来避免浮点数误差,比如使用大整数库(BigInt)进行高精度计算,或者使用特定的数学操作序列来减少误差。 3. **避免直接比较**:在比较浮点数时,不要直接使用`==`或`!=`,因为它们可能...
标题所提到的知识点是关于在JavaScript编程语言中,如何处理和避免在进行数字计算时出现的精度误差问题。这个问题是数字在以浮点数形式存储时,因为计算机的存储架构是以二进制为基础的,导致一些十进制小数在二进制...
本文对JavaScript的计算性能进行了研究,对比了JavaScript和主流编程语言Java、C++、MATLAB等语言的计算能力、数据精度以及处理时间。研究发现,在较大迭代次数条件下,JavaScript与C++、Java的数据处理时间相当,...
在JavaScript编程语言中,精确计算是一项重要的需求,特别是在金融、科学计算或任何需要高精度数值操作的场景。由于JavaScript的内置Number类型使用浮点数表示,这可能导致在进行大数运算时出现微小的误差。标题...
### JavaScript小数精度...这些函数可以应用于各种场景下的浮点数运算,特别是在金融和统计等需要高精度计算的领域中尤为重要。开发者可以根据实际需求选择合适的函数来优化自己的代码,从而提高应用的准确性和可靠性。
JavaScript在处理浮点数精度问题时常常会遇到挑战,因为其内部表示...在项目中,`test.html`可能是用来测试这些精度计算方法的网页,而`math.js`、`bignumber.js`、`big.js`是相应的库文件,可以直接引入到项目中使用。
总的来说,JavaScript版`BigDecimal`类库为开发者提供了一种解决JavaScript精度问题的工具,使得在进行金融计算、科学计算或其他需要高精度计算的场合下,能够得到准确的结果。通过学习和应用这个库,开发者可以更好...
`DoubleCount.js`可能提供了更精确的浮点数计算方法,或者提供了方便的比较和格式化工具。 ```javascript // 引入DoubleCount.js库 const doubleCount = require('DoubleCount.js'); // 使用库中的方法处理...
3. **使用特定库**:有一些JavaScript库,如`decimal.js`或`big.js`,专门用于处理高精度浮点数计算。这些库内部使用大整数算法,能够确保计算的精确性。 根据提供的文件名`FloatCumulateV1.html`和`js`,我们可以...
在JavaScript中,处理二进制数据流是常见的需求,特别是在科学计算、图形处理或网络通信等领域。`Uint8Array`是JavaScript中用于处理字节数组的类型,它提供了一种高效的方式来访问和操作二进制数据。然而,...
这种方法不受代码混淆的影响,同时也减少了开发工作量和计算开销。 - **性能开销小**:通过精心设计,该系统在准确检测恶意JavaScript的同时,对性能的影响非常小,确保了用户体验不会受到影响。 #### 实验评估 ...
在JavaScript和jQuery中,精度计算通常涉及到数字的四舍五入和保留小数位数的操作。这在处理货币、百分比或任何需要精确数值表示的数据时尤为重要。`toFloat`函数是一个自定义的jQuery方法,用于将HTML元素中的数值...
在“计算器2.0”这个项目中,可能包含了一个优化过的JavaScript代码实现,旨在提供一个无精度损失的计算体验。这可能包括对上述策略的运用,或者采用了一些特定的算法和数据结构来保证计算的精确性。通过查看源代码...
这一章节深入探讨了JavaScript中的数字类型,包括数值运算、数学函数的使用,以及如何处理浮点数的精度问题。对于那些需要进行精确计算或数据处理的开发者来说,这部分内容尤为重要。 #### 3. 处理字符串 字符串...
JS计算精度解决方案 a-calc
比如,针对JavaScript的浮点数运算精度问题,例子中的加法和减法函数使用了特定的处理方式来提高计算的精确度。这展示了在编写脚本库时,不仅要考虑功能实现,还需要考虑实际运行环境和可能遇到的问题。 总的来说,...
在JavaScript中,计算圆周率(Pi)通常需要利用数学算法,因为JavaScript的内置数据类型只支持有限精度的浮点数,通常最多提供16位小数。为了计算到小数点后100位,我们需要自定义一个大数类,能够处理超过常规...