2009-12-07 3 views
9

J'utilise jQuery, et je veux résumer les valeurs dans ma colonne de table, tout semble fonctionner très bien, mais ma valeur est retournée une chaîne avec toutes les valeurs ajoutées comme: 123.5013.0012.35Ajout de flotteurs avec javascript

Comment puis-je les additionner correctement?

var totals 

$(".add").each(function(i) { 
    totals += parseFloat($(this).text()).toFixed(2); 
}); 

console.log(totals); 
+2

Dude. Pourquoi utilisez-vous 'toFixed' avant d'avoir le total? Cela le transforme en chaîne, puis ils sont en train d'être ajoutés. Votre sortie devrait vous avoir compris. Deuxièmement, en supposant que cela * fonctionne * comme vous le pensiez (reste comme un flotteur), vous seriez en train de dépasser la précision avant d'avoir votre total. – mpen

Répondre

16

Vous avez plusieurs erreurs ici. On n'initialise pas les totaux à quelque chose de numérique, comme 0.0. La seconde ne réalise pas que .toFixed() retourne une chaîne. Javascript concatène les chaînes ensemble, plutôt que d'ajouter des nombres.

Fondamentalement, la même question a déjà été posée en tant que javascript-why-does-this-produce-and-ugly-string-i-would-like-currency et les réponses devraient résoudre ce problème pour vous.

+0

C'est une monnaie donc je besoin d'avoir une précision de 2 décimales. –

+1

Si vous voulez juste que la sortie finale ait cette précision, attendez d'appeler toFixed (2) jusqu'à la fin. Puis tout jusqu'à ce point ajoute des nombres, pas des chaînes. Si vous êtes préoccupé par les calculs intermédiaires, vous devez réfléchir à deux ou trois choses. S'il s'agit d'une application "jouet", utilisez parseFloat() sur la sortie de toFixed() pour vous assurer qu'il s'agit bien d'un numéro, puis appelez à nouveauFixed() à la fin. S'il s'agit d'une application "réelle", vous ne devriez probablement pas utiliser de valeurs à virgule flottante pour la devise. –

+0

attente jusqu'à la fin a fait l'affaire. Je ne devrais pas avoir à initialiser la valeur, correct? –

5

est ici une version de travail (testé dans Firefox 3.5):

<!DOCTYPE html> 
<html> 
<head> 
    <title>Sum of nubers</title> 

    <script src="jquery.js" type="text/javascript"></script> 
    <script type="text/javascript"> 

     $(function(){ 
      var total = 0; 
      $(".add").each(function(){ 
       total += parseFloat($(this).text()); 
      }); 
      alert(total.toFixed(2)); 
     }); 
    </script> 
</head> 
<body> 
<div class="add">23.4567</div> 
<div class="add">98.7654</div> 
</body> 
</html> 

qui est juste l'une des nombreuses façons de le faire. Jetez un oeil à cette question pour plusieurs autres méthodes:

How to convert strings to floats

+0

il retourne encore une chaîne comme '02.3402220.000' –

+0

Cela a fonctionné pour moi, je stockais le flottant dans un objet, en quelque sorte il a continué à être traité comme une chaîne, donc j'étais explicite:' [-] total + = parseFloat ($ (this) .text()); '[+]' total = parseFloat (total) + parseFloat ($ (this) .text()); ' – roberthuttinger

2

On dirait qu'il fait une chaîne ajouter. Essayez de définir var totals = 0;

+0

Je reçois toujours' 02.3402220.000' –

3
var totals 

$(".add").each(function(i) { 
    totals += parseFloat($(this).text()); 
}); 

console.log(totals.toFixed(2)); 

peut-être utiliser Math.round, sol ou Ceil

2
function update_total() { 
    var total = 0.0; 
    $('.invoice_service_price').each(function(index){ 
     var val=parseFloat($(this).html().trim()); 
     if(!isNaN(val)) total += val; 
    }); 
    alert("total="+total); 
    }; 
3

Simple essayer. ça fonctionne pour moi.

var totals= 0; 
    $(".add").each(function() { 
     if (jQuery(this).val() != '') 
      totals= Number(totals) + Number(jQuery(this).val()); 
    }); 
    console.log(totals);