美文网首页
js浮点数精度问题

js浮点数精度问题

作者: 王哈哈zzz | 来源:发表于2022-11-04 13:33 被阅读0次

一、问题描述:7+5.88=12.879999,本应12.88,为何是12.879999,问了同事才知道js精度问题

  • 错误代码
this.maxRefundPrice = data.postage_price + Number(data.total_refund_price); // postage_price=7,data.total_refund_price=5.88
this.rerundPrice = this.maxRefundPrice; // 12.879999
  • 正确代码
this.maxRefundPrice = (data.postage_price + Number(data.total_refund_price)).toFixed(2); // postage_price=7,data.total_refund_price=5.88
this.rerundPrice = this.maxRefundPrice; // 12.88

二、测试乘数:

alert(45.6*13);

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

三、问题扩展:

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

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更多的作用不在于此

<pre style="margin: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; font-family: "Courier New", serif; font-size: 12px; overflow-wrap: break-word;"><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></pre>

相关文章

  • js精度问题

    关于js浮点数计算精度不准确问题的解决办法 今天在计算商品价格的时候再次遇到js浮点数计算出现误差的问题,以前就一...

  • JavaScript浮点数的精度问题深究

    JavaScript浮点数的精度问题 javascript浮点数的精度问题是老生常谈了,但往往只知道0.1 + 0...

  • js浮点数精度计算问题

    前言 项目中,总是不可避免会出现js的浮点数精度计算问题。抛出经典问题:为什么0.1===0.1,0.1+0.2!...

  • js浮点数精度计算问题解决

    在工作中遇到这种精度问题,例如: 大多数语言在处理浮点数的时候都会遇到精度问题,但是在JS里似乎特别严重,再来看一...

  • js 处理四则运算失去精度问题

    js 处理四则运算失去精度问题 计算精度,特别是浮点数计算。举个栗子 然后我寻求各种解决办法,其中用了lodash...

  • C 浮点数

    浮点数存储带来的问题 问题背景 计算机中浮点数(float或double类型)都有精度范围,对于超出精度范围的浮点...

  • [js]数值的精度

    基础知识 js内部所有数字在计算机内存中的表示都是64位双精度浮点数 双精度浮点数表示法的副作用 使用二进制浮点数...

  • js数字精度丢失问题

    一、JS数字精度丢失的一些典型问题 1. 两个简单的浮点数相加1 0.1 + 0.2 != 0.3// true ...

  • 浮点数计算中的精度丢失

    1 js浮点数运算精度丢失 如果你用过js计算浮点数你肯定会遇到过下面这种情况:(我的小学白读了吗==。) (其...

  • BigDecimal如何解决浮点数精度问题

    转自BigDecimal如何解决浮点数精度问题

网友评论

      本文标题:js浮点数精度问题

      本文链接:https://www.haomeiwen.com/subject/fvyptdtx.html