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

时间:2014-03-16 20:50:13

标签: javascript rounding

请仅使用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>

但是,我不需要输入'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”。

这可能吗?

3 个答案:

答案 0 :(得分:33)

这应该这样做:

2 * Math.round(underbust / 2);

答案 1 :(得分: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 :(得分:-1)

我是一个绝对的业余爱好者,但我犯了错误的方式

2 * parseInt(value / 2)

但它完全符合我的要求 - Math.round将其舍入为0.5 ParseInt在0

做到了