redondeo parseFloat
-
09-10-2019 - |
Pregunta
Tengo función de JavaScript que agrega automáticamente los campos de la señal de entrada, pero la adición de números como 1,35 + 1,35 + 1,35 me da una salida de 4.050000000000001, sólo como ejemplo. ¿Cómo se puede redondear I del total, al segundo decimal en lugar de esa larga cadena?
Los campos de entrada tendrán algo más que el ejemplo 1.35, así que necesitará el total a no tener más de 2 puntos después del punto decimal. Aquí está el código completo de trabajo:
<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>
Algunas cosas que he tratado, que deben trabajar pero estoy de aplicación claramente de forma incorrecta:
for(var i = 0; i < elements.length; ++i){
total += parseFloat(elements[i].value.toString().match(/^\d+(?:\.\d{0,2})?/));
var str = total.toFixed(2);
o
for(var i = 0; i < elements.length; ++i){
total += parseFloat(elements[i].value * 100) / 100).toFixed(2)
también han tenido suerte con Math.floor
Solución
Uso toFixed()
a num
ronda a 2 dígitos decimales usando el método de redondeo tradicional. Se redondeará 4,050000000000001-4,05.
num.toFixed(2);
Es posible que prefiera utilizar toPrecision()
, que se tira de cualquier ceros.
Ejemplo :
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
Referencia: Número JavaScript Formato - decimal de precisión
Otros consejos
var num = 4.050000000000001;
num = num.toFixed(2);
toFixed
redondeará hacia arriba dependiendo de la cantidad de dígitos después del punto decimal que estás buscando.
Se puede utilizar Math.round(total*100000000000)/100000000000;
en el código. Se trabajará para la mayoría de los casos
Estos trabajos:
$(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)); });
}
);
Esta falla:
$(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); });
}
);
Así que tenga cuidado la forma de colocar el paréntesis () ... En el primer caso, el redondeo funcionará, pero no va a funcionar en el segundo ...
En lugar de redondeo, es posible que desee utilizar el puerto de BigDecimal de Java para obtener matemáticas decimal realidad precisa.