web-dev-qa-db-fra.com

parseFloat arrondi

J'ai une fonction javascript qui ajoute automatiquement les champs de saisie ensemble, mais l'ajout de nombres comme 1,35 + 1,35 + 1,35 me donne une sortie de 4,050000000000001, juste à titre d'exemple. Comment puis-je arrondir le total à la deuxième décimale au lieu de cette longue chaîne?

Les champs de saisie auront plus que l'exemple 1,35, j'ai donc besoin du total pour ne jamais avoir plus de 2 points après la décimale. Voici le code de travail complet:

<html>
<head>
<script type="text/javascript">
function Calc(className){
var elements = document.getElementsByClassName(className);
var total = 0;

for(var i = 0; i < elements.length; ++i){
total += parseFloat(elements[i].value);
}

document.form0.total.value = total;
}

function addone(field) {
  field.value = Number(field.value) + 1;
  Calc('add');
}
</script>
</head>
<body>
<form name="form0" id="form0">
1: <input type="text" name="box1" id="box1" class="add" value="0" onKeyUp="Calc('add')" onChange="updatesum()" onClick="this.focus();this.select();" />
<input type="button" value=" + " onclick="addone(box1);">
<br />

2: <input type="text" name="box2" id="box2" class="add" value="0" onKeyUp="Calc('add')" onClick="this.focus();this.select();" />
<input type="button" value=" + " onclick="addone(box2);">
<br />

<br />
Total: <input readonly style="border:0px; font-size:14; color:red;" id="total" name="total">
<br />
</form>
</body></html>

Certaines choses que j'ai essayées, qui devraient fonctionner, mais je les applique clairement de manière incorrecte:

for(var i = 0; i < elements.length; ++i){
total += parseFloat(elements[i].value.toString().match(/^\d+(?:\.\d{0,2})?/));

var str = total.toFixed(2);

ou

for(var i = 0; i < elements.length; ++i){
total += parseFloat(elements[i].value * 100) / 100).toFixed(2)

N'ont également pas eu de chance avec Math.floor

41
JB.

Utilisez toFixed() pour arrondir num à 2 chiffres décimaux en utilisant la méthode d'arrondi traditionnelle. Il arrondira 4,050000000000001 à 4,05.

num.toFixed(2);

Vous préférerez peut-être utiliser toPrecision(), qui supprimera les zéros de fin résultants.

Exemple :

1.35+1.35+1.35 => 4.050000000000001
(1.35+1.35+1.35).toFixed(2)     => 4.05
(1.35+1.35+1.35).toPrecision(3) => 4.05

// or...
(1.35+1.35+1.35).toFixed(4)     => 4.0500
(1.35+1.35+1.35).toPrecision(4) => 4.05

Référence: Format de nombre JavaScript - Précision décimale

62
marcog
var num = 4.050000000000001;

num = num.toFixed(2);

toFixed arrondira en fonction du nombre de chiffres après la décimale que vous recherchez.

3
user1385191

Vous pouvez utiliser Math.round(total*100000000000)/100000000000; dans le code. Cela fonctionnera pour la plupart des cas

2
user1938455

Cela marche:

$(document).ready(
    function() {
            $('#field1').blur(function(){ $('#field2').val(parseFloat($(this).val() * 2.2).toFixed(1)); });
            $('#field2').blur(function(){ $('#field1').val(parseFloat($(this).val() / 2.2).toFixed(1)); });
    }
);

Cela échoue:

$(document).ready(
    function() {
            $('#field1').blur(function(){ $('#field2').val(parseFloat($(this).val() * 2.2)).toFixed(1); });
            $('#field2').blur(function(){ $('#field1').val(parseFloat($(this).val() / 2.2)).toFixed(1); });
    }
);

Faites donc attention à la façon dont vous placez vos parenthèses () ... Dans le premier cas, l'arrondi fonctionnera, mais ne fonctionnera pas dans le second ...

1
Real Melancon

Au lieu d'arrondir, vous pouvez utiliser le port de Java BigDecimal pour obtenir des mathématiques décimales réellement précises.

0
Michael Borgwardt