ParseFloat округления - PullRequest
       33

ParseFloat округления

40 голосов
/ 09 января 2011

У меня есть функция javascript, которая автоматически добавляет поля ввода вместе, но добавление чисел, таких как 1.35 + 1.35 + 1.35, дает мне вывод 4.050000000000001, как пример. Как я могу округлить сумму до второго десятичного числа вместо этой длинной строки?

В полях ввода будет больше, чем просто пример 1.35, поэтому мне нужно, чтобы итоговое значение никогда не превышало 2 точек после запятой. Вот полный рабочий код:

<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>

Некоторые вещи, которые я пробовал, должны работать, но я явно неправильно их реализую:

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

var str = total.toFixed(2);

или

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

Также не повезло с Math.floor

Ответы [ 5 ]

61 голосов
/ 09 января 2011

Используйте toFixed(), чтобы округлить num до 2 десятичных цифр, используя традиционный метод округления.Он округляется с 4.050000000000001 до 4.05.

num.toFixed(2);

Возможно, вы предпочтете использовать toPrecision(), что приведет к удалению любых конечных нулей в результате.1012 *

Ссылка: Числовой формат JavaScript - десятичная точность

3 голосов
/ 09 января 2011
var num = 4.050000000000001;

num = num.toFixed(2);

toFixed будет округляться в зависимости от того, сколько цифр после запятой вы ищете.

2 голосов
/ 20 января 2016

Вы можете использовать Math.round(total*100000000000)/100000000000; в коде. Это будет работать для большинства случаев

1 голос
/ 01 июня 2012

Это работает:

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

Это не удалось:

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

Так что будьте осторожны при размещении скобок () ... В первом случае округление будет работать, а во втором - не будет ...

0 голосов
/ 09 января 2011

Вместо округления вы можете использовать порт Java BigDecimal для получения точной десятичной математики.

...