Javascript 如何使用Math.round将数字四舍五入到最近的偶数?

Javascript 如何使用Math.round将数字四舍五入到最近的偶数?,javascript,rounding,Javascript,Rounding,请只使用JavaScript 这是我第一次尝试自己编写JavaScript。我成功地操纵了朋友们过去为我编写的代码,但我从未从零开始编写自己的代码,也没有花时间尝试理解语言本身,直到最近 我正在尝试制作一个基本的胸罩尺寸计算器,它从用户输入中获取数字(测量值),将它们传递到一个函数中,然后向用户返回(计算)胸罩尺寸 因为我对这门语言是如此陌生,所以我现在只想写一部分——“波段大小” 我有一个输入字段,用户可以输入他们的“胸围测量”,我现在已经设置为四舍五入。这是它的意图。看这里 <html

请只使用JavaScript

这是我第一次尝试自己编写JavaScript。我成功地操纵了朋友们过去为我编写的代码,但我从未从零开始编写自己的代码,也没有花时间尝试理解语言本身,直到最近

我正在尝试制作一个基本的胸罩尺寸计算器,它从用户输入中获取数字(测量值),将它们传递到一个函数中,然后向用户返回(计算)胸罩尺寸

因为我对这门语言是如此陌生,所以我现在只想写一部分——“波段大小”

我有一个输入字段,用户可以输入他们的“胸围测量”,我现在已经设置为四舍五入。这是它的意图。看这里

<html>

<head>

<script type="text/javascript">

 function calculate() 
  {
   var underbust = document.getElementById("underBust").value;

    if (underbust.length === 0) 
     {
      alert("Please enter your underbust measurement in inches");
      return;
     }

    document.getElementById("bandsize").innerHTML = Math.round(underbust);
   }

</script>

</head>

<body>
<input type="number" id="underBust" /> inches<br>
<input type="submit" value="Submit" onclick="calculate()" /><br>
<b>underbust:</b> <div id="bandsize">bandsize will appear here</div><br>
</body>

</html>

函数计算()
{
var underbust=document.getElementById(“underbust”).value;
如果(下推长度===0)
{
警告(“请以英寸为单位输入下推力测量值”);
返回;
}
document.getElementById(“bandsize”).innerHTML=Math.round(底部);
}
英寸

底部:带宽大小将显示在此处
但是,我不需要输入'underBust'来四舍五入到最接近的整数。我需要把它四舍五入到最接近的偶数,因为胸罩带的尺寸只有偶数

例如,如果用户输入数字“31.25”,代码当前会将其四舍五入为“31”,但我需要将其四舍五入为“32”

如果用户输入数字“30.25”,代码将正确地将其四舍五入为“30”,因为在这种情况下,最接近的整数和最接近的整数偶数是相同的。但是,如果用户输入“30.5”,代码会将其四舍五入为“31”,但我仍然需要将其四舍五入为“30”

基本上,如果用户输入等于或大于奇数(29.00变为30,31.25变为32,等等),我需要对数字进行四舍五入。如果用户输入大于或等于一个偶数而小于下一个奇数(28、28.25、28.75等),我需要将其舍入(在上一个示例中,所有情况下为28)。奇数是四舍五入的中间除法,而不是任何数字的“.5”

这可能吗?

这应该可以做到:

2 * Math.round(underbust / 2);

我是个十足的业余爱好者,但我做得不对

2*parseInt(值/2)

但它确实做到了我所需要的——数学。四舍五入
ParseInt是在0时完成的,如果您也希望格式化,请以@Bergi的答案为基础:

function roundToEven(value) {
  return Number.isNaN(n)
    ? 0.0
    : 2 * Math.round(value / 2);
}

/**
 * Round-to-even with a fixed number of decimals (2 decimals = to cent/öre). Returns [ rounded value, formatted rounded value ].
 * @param {*} n The number to round-to-even, with the given number of decimals
 * @param {*} decimals The number of decimals in base10 to round the number at.
 */
function roundToEvenFixed(n, decimals = 2.0) {
  if (Number.isNaN(n) || Number.isNaN(decimals)) {
    return 0.0
  }

  const value = (Math.round((n * Math.pow(10, decimals)) / 2) * 2) / Math.pow(10, decimals),
        formatted = value.toFixed(decimals);

  return [ value, formatted ]
}
在需要无偏差舍入时非常有用。用法:

console.log(`Amount: ${roundToEvenFixed(i.quantity * i.unitPrice.amount)[1]} kr`)
裁判

谢谢!我觉得这是一些基本的数学,我应该知道,但没有考虑。。。是的。刚做了数学题,我现在觉得自己很笨。我可以给你一个数学解释,但也许你可以通过在头脑中用示例值计算表达式来更好地理解它。最接近的奇数是:2*math.floor(n/2)+1@Nitin不,
Math.ceil(0.1)
四舍五入到1(奇数),而不是0(偶数)@Henrik,我认为Nitin指的是Math.ceil(),如
2*Math.ceil(0.1/2)
中所述,它将给出2-下一个偶数整数。这是错误的,因为
2*parseInt(1.5/2)=0
,但应该是
2
基于这个问题,这个答案是正确的,但是如果你正在寻找一个“即使距离相等,也要到最近的整数”的答案(就像在一些科学场合中使用的)这个答案仍然存在一个问题。它越来越近了,但请尝试
roundToEvenFixed(0.12510,2)
。这个值舍入到0.12,而它应该舍入到0.13,因为它比0.12更接近0.13。我还没有找到解决这个问题的方法。