Как округлить в JavaScript как PHP сделать - PullRequest
0 голосов
/ 23 ноября 2018

ИНФОРМАЦИЯ: правильный ответ: https://stackoverflow.com/a/54721202/4359029

Я пытаюсь округлить число с плавающей точкой в ​​Javascript так же, как я делаю это в PHP;но я не могу сделать оба языка одинаковым образом: 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


Я пробовал с другими решениями ... но безуспешно.

Может кто-нибудь сказать мнеКак заставить Javascript округляться, чтобы он действовал как PHP?

Не могли бы вы сказать мне, почему они работают по-разному в случае, который я объясняю?

Ответы [ 4 ]

0 голосов
/ 16 февраля 2019

Я думаю, что правильный ответ следующий:

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, со всеми числами, которые я пробовал.

0 голосов
/ 23 ноября 2018

Вы можете сделать это следующим образом:

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

Проблема в том, что JavaScript технически не так.6.4049 -> становится 6,405 при округлении (что до 2dp равно 6,40), поэтому оно не работает должным образом.Вы должны запустить функцию дважды для округления 405 -> 41.

Источник: математика JavaScript, округление до двух десятичных знаков

^^расширение использования ответа Брайса.

0 голосов
/ 23 ноября 2018

Вы можете использовать toPrecision Функция

Будет округлено на precision.Здесь я округлил до 4, чтобы получить 6.405, а затем округлил до 3, чтобы получить 6.41

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

console.log(parseFloat((6.404999999999999).toPrecision(4)).toPrecision(3));
0 голосов
/ 23 ноября 2018

Вы можете попробовать

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
...