如何像JavaScript一样四舍五入进行JavaScript处理

时间:2018-11-23 16:36:43

标签: javascript php math rounding

  

信息:正确的答案是https://stackoverflow.com/a/54721202/4359029

我试图以与在PHP中相同的方式对Javascript中的浮点数进行取整;但是我无法用以下数字以相同的方式使两种语言一致:6.404999999999999

当我使用PHP进行舍入时,会得到:6.41,但是当我尝试使用Javascript进行舍入时,总会得到6.40

我的Javascript尝试:

尝试#1:

module.exports = function round (value, precision, mode) {
  var m, f, isHalf, sgn // helper variables
  // making sure precision is integer
  precision |= 0
  m = Math.pow(10, precision)
  value *= m
  // sign of the number
  sgn = (value > 0) | -(value < 0)
  isHalf = value % 1 === 0.5 * sgn
  f = Math.floor(value)

  if (isHalf) {
    switch (mode) {
      case 'PHP_ROUND_HALF_DOWN':
      // rounds .5 toward zero
        value = f + (sgn < 0)
        break
      case 'PHP_ROUND_HALF_EVEN':
      // rouds .5 towards the next even integer
        value = f + (f % 2 * sgn)
        break
      case 'PHP_ROUND_HALF_ODD':
      // rounds .5 towards the next odd integer
        value = f + !(f % 2)
        break
      default:
      // rounds .5 away from zero
        value = f + (sgn > 0)
    }
  }

  return (isHalf ? value : Math.round(value)) / m
}

摘自:http://locutus.io/php/math/round/

尝试#2:

round(decimal: number, decimalPoints: number): number{
    let roundedValue = Math.round(decimal * Math.pow(10, decimalPoints)) / Math.pow(10, decimalPoints);

    console.log(`Rounded ${decimal} to ${roundedValue}`);
    return roundedValue;
}

摘自:https://stackoverflow.com/a/50918962/4359029


我尝试了其他解决方案...但是没有成功。

有人可以告诉我如何使Java的四舍五入像PHP一样吗?

您能告诉我为什么在我解释的情况下它们以不同的方式起作用吗?

4 个答案:

答案 0 :(得分:4)

您可以使用toPrecision功能

它将以提供的precision进行四舍五入。在这里,我将4舍入以获得6.405,然后将3舍入以获得6.41

parseFloat((6.404999999999999).toPrecision(4)).toPrecision(3);

console.log(parseFloat((6.404999999999999).toPrecision(4)).toPrecision(3));

答案 1 :(得分:2)

您可以这样做:

function roundToXDigits(value, digits)
{
    if (!digits) {
        digits = 2;
    }

    value = value * Math.pow(10, digits);
    value = Math.round(value);
    value = value / Math.pow(10, digits);

    return value
}

var num = roundToXDigits(6.404999999999999, 3); //creates 6.405

console.log(roundToXDigits(num, 2)); //creates 6.41

问题是技术上并没有错。四舍五入时,6.4049->变为6.405(2dp为6.40),这就是为什么它无法按预期工作的原因。您必须运行功能两次舍入到405-> 41。

来源:JavaScript math, round to two decimal places

^^布赖斯答案的扩展用法。

答案 2 :(得分:0)

您可以尝试

console.log(Number(n.toFixed(3)).toFixed(2));

例如

var n = 6.404999999999999;
console.log(n.toFixed(2)); //=> 6.40
console.log(n.toFixed(3)); //=> 6.405

答案 3 :(得分:0)

我认为下一个正确答案

function roundLikePHP(num, dec){
  var num_sign = num >= 0 ? 1 : -1;
  return parseFloat((Math.round((num * Math.pow(10, dec)) + (num_sign * 0.0001)) / Math.pow(10, dec)).toFixed(dec));
}

我用1.015尝试了其他解决方案,但未按预期工作。

此解决方案可以很好地工作,就像PHP回合一样,可以使用我尝试过的所有数字。