web-dev-qa-db-fra.com

JavaScript ajoutant un problème de nombres décimaux

Je fais donc un script qui ajoute deux nombres (nombres décimaux) ensemble, ce que j'ai rencontré un problème.

http://jsfiddle.net/DerekL/esqnC/

J'ai fait le script, ça se passe plutôt bien:

0.1 + 0.5  //0.6
0.2 + 0.3  //0.5

Mais bientôt je vois:

0.1 + 0.2  //0.30000000000000004
0.01 + 0.06  //0.06999999999999999

Et ça ne me semble pas juste. Je sais que c'est une lacune d'utiliser flottant point avec des bits finis, mais je ne trouve pas un moyen de résoudre ce problème.

Math.ceil   //No
Math.floor  //No
.slice      //No

[~ # ~] mise à jour [~ # ~]

Est-il possible de multiplier d'abord les nombres par 1000, puis de les additionner puis de les diviser par 1000?

50

Utilisez toFixed pour le convertir en chaîne avec quelques décimales rasées, puis reconvertissez-le en nombre.

+(0.1 + 0.2).toFixed(12) // 0.3

Il semble que toFixed d'IE ait un comportement étrange, donc si vous avez besoin de prendre en charge IE quelque chose comme ça pourrait être mieux:

Math.round((0.1 + 0.2) * 1e12) / 1e12
52
Dagg Nabbit

Tester ce Javascript:

var arr = [1234563995.721, 12345691212.718, 1234568421.5891, 12345677093.49284];

var sum = 0;
for( var i = 0; i < arr.length; i++ ) {
    sum += arr[i];
}

alert( "fMath(sum) = " + Math.round( sum * 1e12 ) / 1e12 );
alert( "fFixed(sum) = " + sum.toFixed( 5 ) );

Conclusion

N'utilisez pas Math.round( (## + ## + ... + ##) * 1e12) / 1e12

Utilisez plutôt ( ## + ## + ... + ##).toFixed(5) )

Dans IE 9, toFixed fonctionne très bien.

5
Esteban Aliaga
function add(){
    var first=parseFloat($("#first").val());
    var second=parseFloat($("#second").val());
    $("#result").val(+(first+second).toFixed(2));
}

DEMO.

5
The Alpha

C'est un problème courant avec les virgules flottantes.

Utilisez toFixed en combinaison avec parseFloat.

Voici exemple en JavaScript:

function roundNumber(number, decimals) {
    var newnumber = new Number(number+'').toFixed(parseInt(decimals));
    return parseFloat(newnumber); 
}

0.1 + 0.2;                    //=> 0.30000000000000004
roundNumber( 0.1 + 0.2, 12 ); //=> 0.3