转自:http://segmentfault.com/a/1190000002613722
原因:
Javascript采用了IEEE-745浮点数表示法(几乎所有的编程语言都采用),这是一种二进制表示法,可以精确地表示分数,比如1/2,1/8,1/1024。遗憾的是,我们常用的分数(特别是在金融的计算方面)都是十进制分数1/10,1/100等。二进制浮点数表示法并不能精确的表示类似0.1这样 的简单的数字,上诉代码的中的x和y的值非常接近最终的正确值,这种计算结果可以胜任大多数的计算任务:这个问题也只有在比较两个值是否相等时才会出现。
<!DOCTYPE html> <html> <head> <title>Number Example 1</title> <script type="text/javascript"> alert(0.1 + 0.2); //浮点运算 </script> </head> <body> </body> </html>
0.1 => 0.0001 1001 1001 1001…(无限循环)
0.2 => 0.0011 0011 0011 0011…(无限循环)
双精度浮点数的小数部分最多支持 52 位,所以两者相加之后得到这么一串 0.0100110011001100110011001100110011001100110011001100 因浮点数小数位的限制而截断的二进制数字,这时候,我们再把它转换为十进制,就成了 0.30000000000000004。
解决方法:
//加法 Number.prototype.add = function(arg){ var r1,r2,m; try{r1=this.toString().split(".")[1].length}catch(e){r1=0} try{r2=arg.toString().split(".")[1].length}catch(e){r2=0} m=Math.pow(10,Math.max(r1,r2)) return (this*m+arg*m)/m } //减法 Number.prototype.sub = function (arg){ return this.add(-arg); } //乘法 Number.prototype.mul = function (arg) { var m=0,s1=this.toString(),s2=arg.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.prototype.div = function (arg){ var t1=0,t2=0,r1,r2; try{t1=this.toString().split(".")[1].length}catch(e){} try{t2=arg.toString().split(".")[1].length}catch(e){} with(Math){ r1=Number(this.toString().replace(".","")) r2=Number(arg.toString().replace(".","")) return (r1/r2)*pow(10,t2-t1); } }
相关推荐
### Javascript 浮点运算精度问题分析与解决 #### 知识点一:浮点数精度问题的普遍性 首先需要明确的是,浮点运算精度问题并不仅仅存在于JavaScript中,这实际上是计算机科学中的一个普遍问题。原因在于计算机使用...
这样一来,我们就可以像这样比较浮点数:`(1.0 - 0.7).isEqual(0.3)`,这会返回`true`,从而解决了浮点运算精度问题导致的不正确比较。 总的来说,处理JavaScript中的浮点运算问题需要理解浮点数表示的内在限制,并...
在JavaScript编程中,...总结起来,floatOPS.js是一个专注于解决JavaScript中浮点数运算精度问题的插件,通过提供加减乘除四个方法,确保了在进行浮点数运算时的精度,对于需要精确计算的场景具有很高的实用价值。
在实际项目中,这些函数可以有效地解决浮点运算中的精度问题。例如,如果你需要进行金融计算,或者任何对精度有严格要求的场景,都可以使用这些函数来替代JavaScript内置的运算符。 除了上述函数,还有一些其他策略...
Javascript 和大部分语言一样在浮点数运算时,经常出现精度丢失的问题,由于现在的大量Web项目经常涉及到货币计算或数学高级计算,此插件提供简单浮点运算,浮点存储格式符合IEEE754计算机
2. 使用`BigInt`类型:自ES2020起,JavaScript引入了`BigInt`类型,专为处理大整数设计,它不受到53位精度限制,可以存储任意大小的整数,但不支持浮点运算。 3. 将数字转换为字符串:在进行大数运算时,可以将数字...
当超过这个值时,大整数的运算可能会导致精度丢失。例如,9007199254740992加上1、2分别会导致不同的结果,其中9007199254740992 + 1和9007199254740992 + 3会丢失精度,而9007199254740992 + 2和9007199254740992 +...
Decimal.js 是一个专门为JavaScript设计的高精度数字计算库,它主要解决了JavaScript中浮点数运算精度丢失的问题。在JavaScript中,由于其内置的Number类型使用的是双精度浮点数(IEEE 754),在进行大数值或者高...
问题的一个典型例子是0.1+0.2不等于0.3,这是因为JavaScript中的浮点运算在内部表示和运算时会出现误差。 为了解决这个问题,我们可以采用一些方法来提高JavaScript中浮点数运算的精度。一种方法是通过自定义函数来...
1. **JS浮点运算精度问题**:在JavaScript中,由于其内部表示浮点数的方式,可能导致在进行浮点数运算时出现精度丢失的问题。例如,简单的数字相减可能会得到不精确的结果。为了解决这个问题,开发者可能采用了如`...
1. **浮点数精度问题**:由于浮点数的存储方式,JavaScript在进行浮点数运算时可能会出现精度丢失。例如,`0.1 + 0.2 !== 0.3`,这是因为浮点数在二进制下无法精确表示,导致计算结果的小数部分有误差。面试中,理解...
浮点数在计算机内部是以二进制形式存储的,这种表示方式可能导致精度丢失,产生舍入误差。为了解决这一问题,定点数被引入作为替代方案。定点数是一种利用整数来表示带有小数部分的数值,通过预设的小数位数和固定...
这种格式能够表示非常大或非常小的数值,但处理某些特定的浮点运算时可能会损失精度。floating-buffer模块则尝试提供一种不同的方式来处理浮点数,特别是针对8位浮点数的场景,这可能是为了节省内存或者优化计算效率...
其中,`divide()`方法特别值得关注,它支持自定义精度和舍入模式,可以防止因除法运算导致的精度丢失。 4. **舍入策略** `BigDecimal`提供了多种舍入策略,如ROUND_UP(向上舍入)、ROUND_DOWN(向下舍入)等。在...
由于JavaScript中的数字精度限制,当数字非常大或者非常小的时候,直接进行运算可能会有精度丢失的问题。为了解决这一问题,可以使用`***recision()`方法。`toPrecision()`方法可以用来格式化数字为指定位数的精确...
另外,对于更复杂或者性能要求更高的场景,可能还需要考虑其他算法或库,例如BigNumber.js、decimal.js等,它们专为解决大数和高精度计算问题而设计。 文章中的代码示例和解释强调了JavaScript中浮点数运算的不精确...
在JavaScript中,浮点数运算可能会遇到精度问题,这是由于其内部存储机制导致的。浮点数在计算机中是按照二进制浮点格式存储的,这种格式在表示某些十进制小数时会有不可预测的误差。因此,当你进行浮点数相乘时,...