`
talentluke
  • 浏览: 600837 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

js浮点数精度问题

 
阅读更多

 

大多数语言在处理浮点数的时候都会遇到精度问题,但是在JS里似乎特别严重,来看一个例子

alert(45.6*13);

结果居然是592.800000000001,当然加法之类的也会有这个问题

那这是js的错误吗?

当然不是,你的电脑做着正确的二进制浮点运算,但问题是你输入的是十进制的数,电脑以二进制运算,这两者并不是总是转化那么好的,有时候会得到正确的结果,但有时候就不那么幸运了

alert(0.7+0.1);//输出0.7999999999999999
alert(0.6+0.2);//输出0.8

你输入两个十进制数,转化为二进制运算过后再转化回来,在转化过程中自然会有损失了

但一般的损失往往在乘除运算中比较多,而JS在简单的加减法里也会出现这类问题,你也看到了,这个误差也是非常小的,但是却是不该出现的

那该怎么解决呢,ECMA4似乎给了解决方法,但是现在倒不是那么实用的

一种方法,比如0.7+0.1,先把0.1和0.7都乘10,加完之后再除10

另外可以自己写点函数来解决这个问题,自己百度谷歌一下应该有很多,但是最好还是不要用JS做一些复杂的浮点运算,毕竟JS更多的作用不在于此

 

 

 

<script type="text/javascript">

    // 两个浮点数求和
    function accAdd(num1,num2){
       var r1,r2,m;
       try{
           r1 = num1.toString().split('.')[1].length;
       }catch(e){
           r1 = 0;
       }
       try{
           r2=num2.toString().split(".")[1].length;
       }catch(e){
           r2=0;
       }
       m=Math.pow(10,Math.max(r1,r2));
       // return (num1*m+num2*m)/m;
       return Math.round(num1*m+num2*m)/m;
    }
    
    // 两个浮点数相减
    function accSub(num1,num2){
       var r1,r2,m;
       try{
           r1 = num1.toString().split('.')[1].length;
       }catch(e){
           r1 = 0;
       }
       try{
           r2=num2.toString().split(".")[1].length;
       }catch(e){
           r2=0;
       }
       m=Math.pow(10,Math.max(r1,r2));
       n=(r1>=r2)?r1:r2;
       return (Math.round(num1*m-num2*m)/m).toFixed(n);
    }
    // 两数相除
    function accDiv(num1,num2){
       var t1,t2,r1,r2;
       try{
           t1 = num1.toString().split('.')[1].length;
       }catch(e){
           t1 = 0;
       }
       try{
           t2=num2.toString().split(".")[1].length;
       }catch(e){
           t2=0;
       }
       r1=Number(num1.toString().replace(".",""));
       r2=Number(num2.toString().replace(".",""));
       return (r1/r2)*Math.pow(10,t2-t1);
    }
    
    function accMul(num1,num2){
       var m=0,s1=num1.toString(),s2=num2.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);
    }
    
  </script>
  
    <script>
    document.write("使用js原生态方法");
    document.write("<br/> 1.01 + 1.02 ="+(1.01 + 1.02));
    document.write("<br/> 1.01 - 1.02 ="+(1.01 - 1.02));
    document.write("<br/> 0.000001 / 0.0001 ="+(0.000001 / 0.0001));
    document.write("<br/> 0.012345 * 0.000001 ="+(0.012345 * 0.000001));
    document.write("<br/><hr/>");
    document.write("<br/>使用自定义方法");
    document.write("<br/> 1.01 + 1.02 ="+accAdd(1.01,1.02));
    document.write("<br/> 1.01 - 1.02 ="+accSub(1.01,1.02));
    document.write("<br/> 0.000001 / 0.0001 ="+accDiv(0.000001,0.0001));
    document.write("<br/> 0.012345 * 0.000001 ="+accMul(0.012345,0.000001));
    </script>
分享到:
评论

相关推荐

    解决javascript中的浮点数计算不精确问题

    3. **使用库**:有一些库,如提供的`DoubleCount.js`,可以帮助处理浮点数精度问题。`DoubleCount.js`可能提供了更精确的浮点数计算方法,或者提供了方便的比较和格式化工具。 ```javascript // 引入DoubleCount....

    解决js浮点数运算的精度问题

    在javascript中进行运算的时候经常会出现浮点数的问题,导致运算结果不准确 比如:0.1 + 0.2 = 0.30000000000000004 完整demo及解决方案如下: demo .num-tags, .total-tag { text-align: center; } i { ...

    解决JS浮点数(小数)计算加减乘除的BUG

    解决JS浮点数(小数)计算加减乘除的BUG

    javaScript实现浮点数转十六进制字符

    JavaScript实现浮点数转十六进制字符的过程涉及到了浮点数的表示、IEEE 754标准、二进制与十六进制的转换等多个知识点。由于JavaScript直接使用浮点数转十六进制的功能实现并不直接,因此需要借助其他方法来实现。...

    js浮点数处理转精确值

    总的来说,处理JavaScript中的浮点数精度问题需要对浮点数的底层表示有深入理解,并可能需要借助特定的库或自定义算法。通过正确的策略和工具,开发者可以有效地解决这些问题,保证浮点数运算的精确性。

    详解JavaScript 浮点数运算的精度问题

    解决JavaScript浮点数精度问题的一些策略包括: 1. 使用toFixed()方法四舍五入到指定的小数位数,但这不适用于数学计算。 2. 使用库,如`decimal.js`或`big.js`,它们提供了高精度的数学运算。 3. 对于金额计算,...

    main_half_javascript_半精度浮点数_Uint8Array_

    6. **跨平台兼容性**:需要注意的是,虽然JavaScript标准不直接支持半精度浮点数,但现代浏览器和Node.js环境中可以通过自定义函数实现。在不同平台和设备上测试代码,确保其兼容性和正确性。 7. **其他工具和库**...

    js计算精度问题解决方案

    理解这些原理并学会使用相应策略,可以帮助开发者在遇到JavaScript的浮点数精度问题时找到合适的解决方案。在实际项目中,选择合适的方法取决于具体的需求和性能考虑。如果压缩包中的"js-float-accuracy-master"库...

    JS浮点数字操作插件floatOPS.js

    首先,我们来了解一下JavaScript中的浮点数精度问题。由于浮点数在计算机内部是以二进制表示的,有些十进制小数无法精确地转换为二进制,导致了转换误差。例如,0.1 + 0.2 在JavaScript中并不等于0.3,而是略小于0.3...

    JavaScript 浮点数运算 精度问题

    总之,处理JavaScript中的浮点数精度问题需要理解浮点数的内在限制,并采取适当的策略来规避或减少这些限制带来的影响。通过上述方法,可以提高计算的准确性,从而避免项目中出现不必要的错误。

    JS精度计算1、转成整数计算再转换成小数,2、toFixed,3、math.js,4、bignumber.js,5、big.js

    它使用BigNumber类型来处理大数和高精度计算,从而避免了JavaScript浮点数精度问题。例如,`math.bignumber('1234567890.123456789')`可以创建一个大数对象,之后的计算都会保持高精度。 4. **bignumber.js库** `...

    JS浮点数运算结果不精确的Bug解决

    最近在做项目的时候,涉及到产品价格的计算,经常会出现JS浮点数精度问题,这个问题,对于财务管理系统的开发者来说,是个非常严重的问题(涉及到钱相关的问题都是严重的问题),这里把相关的原因和问题的解决方案...

    Javascript 浮点数精确计算

    例如,在累计金额时,如果不考虑浮点数的精度问题,可能会导致最终计算结果与预期有偏差。 为了实现精确的浮点数累加,一种常见做法是使用一个大整数库,或者自己实现一个大数累加算法。这种算法通常会将每个浮点数...

    跟我学习javascript的浮点数精度

    JavaScript中的浮点数精度问题会导致一些看似简单的算术运算产生意外的结果。例如,0.1 + 0.2 实际上并不等于 0.3,而是等于0.***。这反映了双精度浮点数表示法的限制。尽管64位精度已经相当高,但双精度浮点数只能...

    单精度浮点数与四字节十六进制数据的转换(左低右高)

    本篇文章将详细探讨“单精度浮点数”和“四字节十六进制数据”的转换,以及它们在数据分析中的应用。 首先,让我们理解单精度浮点数(Single-Precision Floating Point Number)。按照IEEE 754标准,单精度浮点数...

    JavaScript解决浮点数计算不准确问题的方法分析

    总的来说,处理JavaScript中的浮点数精度问题,关键在于理解浮点数的二进制表示和存储限制,并采取适当的策略,如转换为整数运算或使用高精度库,以确保计算结果的准确性。在实际开发中,需要根据具体需求选择合适的...

    JavaScript浮点数及运算精度调整详解

    JavaScript中的浮点数精度问题是由于IEEE-754标准的二进制浮点数表示法导致的,这种表示法无法准确表示所有十进制小数,特别是那些有无限循环二进制小数位的数值,例如0.1。在JavaScript中,所有的数字都以64位双...

Global site tag (gtag.js) - Google Analytics