2010-11-24 6 views
0

J'ai quelques éléments d'entrée de formulaire avec la classe .commission_plan et différents ID. Je dois résumer les valeurs de cet élément. J'utilise ce code:javascript jquery .each() problème

jQuery(document).ready(function() { 
    var total = 0; 
    $('.commission_plan').each(function() { 
     total = total + parseFloat($(this).val()); 
    }); 
    $('#payment_total_amount_hidden').val(total); 
    $('#payment_total_amount').text('Total: ' + total); 
}): 

Dans mes champs d'entrée sont les valeurs 3,45 et 4,65. Mais pourquoi #payment_total_amount contient 8.100000000000001? Comportement très étrange.

+0

essayer de le faire avec la cartographie. et obtenir la méthode. –

+1

@steven - '.map()' retourne un tableau, ce n'est vraiment pas approprié ici, puisque nous cherchons une seule valeur à la fin de la boucle. –

Répondre

4

Ceci est juste comment les mathématiques à virgule flottante se comporte, pour les situations de monnaie que vous voulez souvent 2 décimales, utilisez donc .toFixed(2) lors du rendu, comme ceci:

var total = 0; 
    $('.commission_plan').each(function(){ 
     total = total + parseFloat($(this).val()); 
    }); 
    $('#payment_total_amount_hidden').val(total.toFixed(2)); 
    $('#payment_total_amount').text('Total: '+total.toFixed(2)); 
}): 
2

Ceci est le résultat de problèmes de précision avec des valeurs à virgule flottante. Vous pouvez essayer d'utiliser la méthode toFixed (n) javascript pour limiter le nombre de décimales. Edit: Comme précisé par Nick dans les commentaires, la méthode toFixed (n) va convertir un float en une chaîne de caractères de sorte qu'il ne doit être utilisé qu'une fois le calcul terminé.

+0

Ce n'est pas l'endroit pour l'utiliser, car le résultat est une chaîne. –

+0

@Nick - pourriez-vous clarifier pourquoi vous ne pouvez pas l'utiliser ici; J'ai testé le résultat et il semble fonctionner comme prévu? –

+0

Vous ajouteriez des nombres à des chaînes, la deuxième boucle serait une chaîne qui n'a pas de méthode '.toFixed()', donc elle exploserait. Vous pouvez le tester ici: http://www.jsfiddle.net/nick_craver/TQ7vn/ –