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?
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
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 ) );
N'utilisez pas Math.round( (## + ## + ... + ##) * 1e12) / 1e12
Utilisez plutôt ( ## + ## + ... + ##).toFixed(5) )
Dans IE 9, toFixed
fonctionne très bien.
function add(){
var first=parseFloat($("#first").val());
var second=parseFloat($("#second").val());
$("#result").val(+(first+second).toFixed(2));
}
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