今天在用JavaScript运算的时候出现了一些问题,后来查了下,原来是JS本身的浮点数运算会有误差造成的。
js的number类型按照ECMA的JavaScript标准,它的Number类型就是IEEE 754的双精度数值,相当于java的double类型。
详细的内容可以参考:
http://forum.eaw.com.cn/thread/10/1
http://blog.csdn.net/xiaocon/archive/2005/09/03/470709.aspx
JavaScript小数在做四则运算时,精度会丢失,这会在项目中引起诸多不便,为了解决浮点数运算不准确的问题,在运算前我们把参加运算的数先升级(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);
}
调用方法:num1.add(num2)
如2.333+3.4 ,则为2.333.add(3.4)
分享到:
相关推荐
在JavaScript中,浮点数运算时出现的精度问题是一个常见的编程挑战。这是因为JavaScript遵循IEEE 754标准来表示和处理浮点数,该标准规定了二进制浮点数的存储方式,导致在进行某些计算时会出现看似不准确的结果。...
JavaScript中的浮点数运算精度问题是一个常见的编程挑战,由于JavaScript中的数字是以64位浮点数格式存储,根据IEEE 754标准,这导致在处理浮点数时会出现一些不直观的结果。以下是对这个问题的深入解析。 浮点数...
Javascript 和大部分语言一样在浮点数运算时,经常出现精度丢失的问题,由于现在的大量Web项目经常涉及到货币计算或数学高级计算,此插件提供简单浮点运算,浮点存储格式符合IEEE754计算机
在javascript中进行运算的时候经常会出现浮点数的问题,导致运算结果不准确 比如:0.1 + 0.2 = 0.30000000000000004 完整demo及解决方案如下: demo .num-tags, .total-tag { text-align: center; } i { ...
这可能涉及使用位操作而不是浮点数的算术运算,以及利用JavaScript引擎的特性,比如避免不必要的类型转换。 5. **应用场景**:半精度浮点数常用于图形渲染、物理模拟、数据压缩等,因为它们可以在保持足够的精度...
在JavaScript编程中,...总结起来,floatOPS.js是一个专注于解决JavaScript中浮点数运算精度问题的插件,通过提供加减乘除四个方法,确保了在进行浮点数运算时的精度,对于需要精确计算的场景具有很高的实用价值。
在JavaScript编程中,...理解JavaScript浮点数计算的局限性并采用适当的策略,可以有效地应对和预防这类问题,保证代码的准确性和可靠性。在开发过程中,始终要对浮点数的运算结果保持警惕,并进行适当的验证和处理。
JavaScript中的浮点数精度问题是由于IEEE-754标准的二进制浮点数表示法导致的,这种表示法无法准确表示所有十进制小数,特别是那些有无限循环二进制小数位的数值,例如0.1。在JavaScript中,所有的数字都以64位双...
- **浮点精度问题**:由于二进制表示的限制,某些浮点运算可能会出现精度误差。 - **3.2 字符串类型** - **拼接与模板字符串**:如何使用加号或模板字符串进行字符串拼接。 - **3.3 布尔类型** - **逻辑运算**:`...
1. **四舍五入**:在进行浮点数运算时,可以设定一定的精度,当结果接近这个精度时进行四舍五入,以达到近似精确的效果。例如,使用`Math.round()`函数或者自定义函数来处理。 2. **使用字符串**:将浮点数转换为...
由于javascript的浮点运算是不精确的(对于大多数编程语言都是这样),此程序使用整数来代替浮点数进行运算,最后再转化为浮点数,可以实现对设置范围内(运算范围在程序中为自定义变量range)的浮点运算实现精度...
这种方法的好处是,你可以通过这个库统一处理所有的浮点数运算,避免了直接使用JavaScript内置运算符可能带来的精度问题。 总结来说,JavaScript中的浮点数运算误差是由于二进制浮点数表示的局限性造成的。通过保留...
JavaScript中的浮点数运算在某些情况下可能会导致不精确的结果,这是由于其内部处理机制和IEEE-754标准的特性所致。在JavaScript中,所有的数字都以Number类型存在,本质上是按照IEEE-754标准的双精度浮点数(double...
4. 浮点数运算存在精度问题,可能导致不精确的结果。 5. 当关心精度时,可以通过转换为整数运算来减少精度损失。 理解这些要点有助于在编写JavaScript代码时更好地处理浮点数,避免不必要的错误和精度问题。
在JavaScript中进行浮点数运算时,经常会出现精度误差的问题。例如,一个简单的加法运算 `0.1 + 0.2` 的结果并不是预期中的 `0.3`,而是 `0.30000000000000004`。这种现象不仅让人困惑,而且在实际应用中可能会导致...
本文介绍了在JavaScript中处理浮点数运算精度损失的一些方法,包括自定义的浮点数除法、乘法以及加法函数。通过这些函数,可以在很大程度上避免由于浮点数运算导致的精度问题,特别是在需要高精度计算的应用场景中尤...
在JavaScript编程语言中,浮点数运算时常会遇到精度问题,这是因为JS的浮点数表示遵循IEEE 754标准,这种表示方式在处理特定数值时可能会产生微小的误差。例如,`37.5 * 5.5` 在JS中计算的结果并不是预期的 `206.08`...