【问题标题】:parseFloat roundingparseFloat 舍入
【发布时间】:2011-01-09 16:56:48
【问题描述】:

我有 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 也没有运气

【问题讨论】:

  • 您实际上并不需要发布所有代码,因为它与这里的问题并不真正相关。只发布相关位。
  • 仅供参考:您的第二个(与 toFixed 有关)sn-p 有语法错误。
  • 供将来参考,感谢@marcog,使用:document.form0.total.value = total.toFixed(2);
  • 不值得理解为什么总和等于这么长的小数点吗?
  • 供以后参考:因为 Javascript 是如何管理浮点值的,所以数字 1.35 无法准确地保存在变量中,甚至无法计算。在 Javascript 控制台 (1.35).toPrecision(52) 中尝试此操作,它会显示 real 值或 Javascript 中的 1.351.350000000000000088817841970012523233890533447265625(除此之外的所有小数均为 0)。

标签: javascript math parsefloat


【解决方案1】:

使用toFixed()num 使用传统的四舍五入方法四舍五入为两位小数。它将 4.050000000000001 舍入到 4.05。

num.toFixed(2);

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

Example:

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 Number Format - Decimal Precision

【讨论】:

  • 参考很有帮助,但我无法弄清楚我做错了什么,它一定是我放置的“toFixed”。我上面的 cmets 为最终目标提供了更多细节
  • @Josh 您的第二个 sn-p 很糟糕,您不想在每次添加后四舍五入。不过,您的第一个看起来不错-这给您带来了什么问题?你确定你之后使用str
  • 当你修复它时,将这个标记为答案。为了适应你,他走得更深入了。
  • 谢谢你用新方法'toFixed'和'toPrecision'启发了我。+1ed
  • 为什么会得到 (1.35+1.35+1.35).toPrecision(4) => '4.050'
【解决方案2】:
var num = 4.050000000000001;

num = num.toFixed(2);

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

【讨论】:

  • 我希望总数(无论总数最终是多少)在小数点后永远不会超过 2 个数字。总数可能是 6.300000000000001。我试过使用不同的“toFixed”变体,但我不知道把它放在哪里让小数点后的总数永远不会超过 2
  • @Josh 在显示值之前调用toFixed,例如document.form0.total.value = total.toFixed(2);
  • @marcog 成功了。我有第二个字段将总数除以 25,我也希望限制小数,但相同的代码不起作用:document.form0.divided.value = total / 25.toFixed(2);
  • @Josh (total / 25).toFixed(2) - 您总是希望在最后一步进行舍入。
  • 啊,我现在明白了。非常感谢@marcog!
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    这行得通:

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

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

    【讨论】:

    • 您应该明确何时 jQuery 是先决条件,因为初学者在没有 jQuery 库的情况下输入此代码并发现它不起作用可能会感到困惑和沮丧。不是每个人都使用 jQuery。
    【解决方案5】:

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

    【讨论】:

    • 我不确定这里是否有必要。他的计算是1.35*3。
    • @marcog: 他得到 4.050000000000001 而不是正确的结果。
    • 也许 Javascript 版本不同,但 Java 类的作用相同 - ideone.com/KqkvN
    • @marcog:不,它没有(编译器在解释浮点文字时会这样做):ideone.com/Za1fb
    • 哦,对,当然。我仍然认为这对于 OP 的需求来说太过分了。为不同的想法 +1。
    猜你喜欢
    • 2012-04-13
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    相关资源
    最近更新 更多