Question

Je fonction javascript qui ajoute automatiquement les champs d'entrée ensemble, mais en ajoutant des chiffres comme 1,35 + 1,35 + 1,35 me donne une sortie de 4,050000000000001, tout comme un exemple. Comment puis-je arrondir le total à la deuxième décimale au lieu de cette longue chaîne?

Les champs d'entrée auront plus que le 1,35 exemple donc j'ai besoin du total de ne jamais avoir plus de 2 points après la virgule. 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>

Il y a des choses que j'ai essayé, ce qui devrait travailler mais je suis les mettre en œuvre 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)

Vous avez eu aussi pas de chance avec Math.floor

Était-ce utile?

La solution

Utilisation toFixed() à num rond à 2 chiffres décimaux en utilisant la méthode d'arrondissement classique. Il arrondit 4,050000000000001 à 4,05.

num.toFixed(2);

Vous pouvez préférer utiliser toPrecision(), qui enlève toutes les zéros résultant.

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: JavaScript Number Format - Précision décimal

Autres conseils

var num = 4.050000000000001;

num = num.toFixed(2);

toFixed arrondira selon le nombre de chiffres après la virgule que vous cherchez.

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

Cela fonctionne:

$(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); });
    }
);

Alors faites attention la façon dont vous placez votre parenthèse () ... En premier cas, l'arrondissement fonctionnera, mais ne fonctionnera pas dans le second ...

Au lieu de l'arrondissement, vous voudrez peut-être utiliser le port de BigDecimal Java pour obtenir réellement précis mathématiques décimal.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top