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

¿Fue útil?

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.

resultante

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top