Округление чисел до 8 десятичных знаков - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть эта функция, она округляет все числа до 8 десятичных знаков.

exports.roundDown = function(number, decimals) {
  try {
    if (!exports.isNumeric(number)) {
      return number;
    }

    decimals = decimals || 8;

    if (!exports.isNumeric(decimals)) {
      return number;
    }

    const ret =  ( Math.floor( number * Math.pow(10, decimals) ) / Math.pow(10, decimals)*1);

    return ret; //(ret < 0.000001) ? 0 : ret;
  } catch(e) {
    return number;
  } 
}

У меня проблема в том, что числа типа 0.00000003 округлены до 0.00000002, вместо того, чтобы отправить действительное число (0.00000003), другие числа работают нормально.

Есть идеи, как это исправить?

Ответы [ 2 ]

2 голосов
/ 08 апреля 2019

Вы пытались исправить?

var num = 0.00000002473;
var n = num.toFixed(8);
//n contains 0.00000002
1 голос
/ 08 апреля 2019

Причина в том, что 0.00000003 не существует.Таким образом, вы никогда не сможете округлить число до этого значения.При сканировании он двоично округляется до ближайшего возможного числа.toPrecision(18) показывает число более точное:

(0.00000003).toPrecision(18) // "2.99999999999999973e-8"

И именно поэтому toFixed() возвращает строку, а не число.Другими словами: невозможно округлить число до 8 десятичных цифр, кроме двоичного числа, такого как 0,5, 0,125

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...