49

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

4

5 回答 5

75

用于使用传统的舍入方法toFixed()num入到 2 位小数。它将 4.050000000000001 舍入到 4.05。

num.toFixed(2);

您可能更喜欢使用toPrecision(),它会去除任何产生的尾随零。

示例

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

参考:JavaScript 数字格式 - 小数精度

于 2011-01-09T17:00:27.667 回答
3
var num = 4.050000000000001;

num = num.toFixed(2);

toFixed将根据您要查找的小数点后的位数四舍五入。

于 2011-01-09T17:00:48.950 回答
2

您可以Math.round(total*100000000000)/100000000000;在代码中使用。它适用于大多数情况

于 2016-01-20T07:42:47.637 回答
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)); });
    }
);

这失败了:

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

所以要小心你放置括号 () 的方式......在第一种情况下,四舍五入会起作用,但在第二种情况下不会起作用......

于 2012-06-01T18:59:37.310 回答
0

您可能希望使用Java 的 BigDecimal 端口来获得实际精确的十进制数学,而不是四舍五入。

于 2011-01-09T17:15:18.917 回答