Javascript 浮点舍入

Javascript 浮点舍入,javascript,math,parsefloat,Javascript,Math,Parsefloat,我有一个javascript函数,可以自动将输入字段添加到一起,但是添加像1.35+1.35+1.35这样的数字会得到4.05000000000001的输出,就像一个例子一样。我怎样才能把总数四舍五入到第二个小数点而不是那个长字符串 输入字段将不仅仅是1.35示例,因此我需要总数在小数点后不超过2点。以下是完整的工作代码: <html> <head> <script type="text/javascript"> function Calc(className

我有一个javascript函数,可以自动将输入字段添加到一起,但是添加像1.35+1.35+1.35这样的数字会得到4.05000000000001的输出,就像一个例子一样。我怎样才能把总数四舍五入到第二个小数点而不是那个长字符串

输入字段将不仅仅是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>

函数计算(类名){
var elements=document.getElementsByClassName(className);
var合计=0;
对于(变量i=0;i
2: 


总数:
我已经尝试过一些事情,这些事情应该会奏效,但我显然没有正确地实施它们:

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(变量i=0;i

for(变量i=0;i
在数学方面也没有运气。floor

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

num.toFixed(2);
您可能更喜欢使用
toPrecision()
,这将去除所有产生的尾随零

:

参考:


toFixed
将根据您要查找的小数点后的位数进行取整。

您可能希望使用取整来获得实际精确的小数点数学。

此方法有效:

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


因此,请小心放置括号()的方式……在第一种情况下,舍入将起作用,但在第二种情况下不起作用……

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

您不需要发布所有代码,因为它与此处的问题并不相关。只发布相关位。仅供参考:第二个(与toFixed相关)代码段有语法错误。为了便于将来参考,多亏@marcog使用:
document.form0.total.value=total.toFixed(2)解决了此问题
难道不值得理解为什么总和等于这么长的小数点吗?供将来参考:因为Javascript如何管理浮点值,数字1.35无法准确地保存在变量中,甚至无法计算。请在Javascript控制台中尝试此操作
(1.35)。toPrecision(52)
,它将向您显示Javascript中的实际值或
1.35
1.35000000000000088817841970012523233890533447265625
(除此之外的所有小数点都是0)。我不确定这在这里是否有必要。他的计算值是1.35*3。@marcog:他得到的是4.05000000000001,而不是正确的结果。可能Javascript版本不同,但Java类做的是相同的-@marcog:不,它没有(不过,编译器在解释浮点文本时会做):哦,对,当然。我仍然认为这对于OP的需求来说是过分的。但是对于不同的想法+1。我希望得到总数(不管总数最终是多少)小数点后的数字不能超过2个。总数可能是6.30000000000000001。我试过使用不同的“toFixed”变体,但我不知道该放在哪里,使总数在小数点后永远不能超过2个decimal@Josh在显示该值之前,对该值调用
toFixed
,例如
document.form0.total.value=total.tOfix(2)
;@marcog成功了。我有第二个字段,将总数除以25,我也希望限制小数,但相同的代码不起作用:
document.form0.divided.value=total/25.toFixed(2);
@Josh
(total/25)。toFixed(2)
-您总是希望在最后一步执行舍入。啊,我现在明白了。非常感谢@marcog!参考资料很有帮助,但我不知道我做错了什么,这一定是我对“toFixed”的放置。我上面的评论为结尾提供了更多细节goal@Josh您的第二个代码段不好,您不想在每次添加后都取整。你的第一个看起来不错-这给你带来了什么问题?你确定你在事后使用了
str
吗?当你修好后,把这一个作为答案。为了适应你,他更深入了。谢谢你用一种新方法“toFixed”和“toPrecision”启发了我。+1我为什么得到(1.35+1.35+1.35)。toPrecision(4)=>'4.050'您应该明确何时jQuery是先决条件,因为对于初学者来说,在没有jQuery库的情况下输入此代码并发现它不起作用可能会令人困惑和沮丧。并非所有人都使用jQuery。
var num = 4.050000000000001;

num = num.toFixed(2);
$(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); });
    }
);