Maison > interface Web > js tutoriel > le corps du texte

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

一个新手
Libérer: 2017-09-25 10:34:06
original
1595 Les gens l'ont consulté

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>
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!