Maison >interface Web >js tutoriel >Comment résoudre le problème de précision des nombres à virgule flottante js

Comment résoudre le problème de précision des nombres à virgule flottante js

一个新手
一个新手original
2017-09-25 10:34:061689parcourir

La plupart des langages rencontreront des problèmes de précision lorsqu'ils traitent des nombres à virgule flottante, mais cela semble être particulièrement grave en JS. Regardons un exemple

alert(45.6*13); 🎜>Résultat Il s'agit en fait de 592.800000000001. Bien sûr, les ajouts et autres auront également ce problème
Est-ce une erreur js ?
Bien sûr que non, votre ordinateur corrige les opérations binaires à virgule flottante, mais le problème est que vous saisissez des nombres décimaux et que l'ordinateur fonctionne en binaire. Les deux ne se convertissent pas toujours aussi bien, et parfois vous obtenez un résultat correct, mais. parfois vous n'êtes pas aussi chanceux
alert(0.7+0.1);//Output 0.7999999999999999
alert(0.6+0.2);//Output 0.8

Vous entrez deux Lorsque les nombres décimaux sont convertis en binaires puis reconverti, il y aura naturellement des pertes pendant le processus de conversion

Mais les pertes générales ont tendance à être davantage liées aux opérations de multiplication et de division, et JS apparaîtra également dans les simples additions et soustractions. Comme vous pouvez voir le problème, cette erreur. est également très petit, mais cela ne devrait pas se produire
Alors, comment le résoudre ? ECMA4 semble avoir une solution, mais ce n'est pas si pratique maintenant
, comme 0,7+0,1, multipliez d'abord 0,1 et 0,7 par 10, puis divisez par 10 après l'ajout
De plus, vous pouvez écrire quelques fonctions pour résoudre ce problème. Vous devriez rechercher sur Baidu et Google pour en trouver beaucoup, mais il est préférable de ne pas utiliser JS. Faites des virgules flottantes complexes. opérations, après tout, JS n'est pas plus utile ici

<script type="text/javascript">  

    // 两个浮点数求和  
    function accAdd(num1,num2){  
       var r1,r2,m;  
       try{  
           r1 = num1.toString().split(&#39;.&#39;)[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(&#39;.&#39;)[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 accp(num1,num2){  
       var t1,t2,r1,r2;  
       try{  
           t1 = num1.toString().split(&#39;.&#39;)[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 ="+accp(0.000001,0.0001));  
    document.write("<br/> 0.012345 * 0.000001 ="+accMul(0.012345,0.000001));  
    </script>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn