@ruslan2

Как округлить десятичное число до первого числа после нулей?

Есть формула, которая может вернуть как целые числа, так и дробные вида 0.1 или 0.000027777391980666935.

На примере последнего, метод .toFixed(2) возвращает 0.0 – что не очень правда и не подходит для меня.

Другой метод – .toPrecision(2) возвращает 0.00003 – что мне подходит.
Но, для целых чисел вида 144004 возвращает 1.4e+5 – это не подходит.
console.log(0.000027777391980666935.toPrecision(2)); // 0.000028
console.log((144004).toPrecision(2)); //1.4e+5

Есть ли решение чтобы поддержвать и целые, и дробные числа?
123 > 123
123.98 > 123.98
123.987654321 > 123.98
123.000000321 > 123.0000003 
0.12345678890 > 0.12
  • Вопрос задан
  • 184 просмотра
Решения вопроса 1
@ruslan2 Автор вопроса
// Making value more human look
function humanizationNumber(value, decimalsLimit) {
    var result = false;

    var parts = value.toString().split('.');
    var integer = parts[0];
    var decimals = parts[1];

    if (!(1 in parts)) {
        // Value is nice looking integer
        result = value

    } else {
        // Humanizing the decimals
        var decimalsValue = decimals.split('');
        var rationalLimit = decimalsLimit;

        if (decimalsLimit > decimalsValue.length) {
            // Do not round value under the limit
            result = value

        } else if ((Math.abs(integer) > 0) || (decimalsValue[0] > 0)) {
            // Rounding to decimalsLimit
            if ((Math.abs(integer) < 1) && (decimalsLimit < 1)) rationalLimit++;
            result = parseFloat(parseFloat(integer + '.' + decimalsValue.join('')).toFixed(rationalLimit))

        } else {
            // Rounding to the first meaningful value
            for (var count = 0; decimalsValue[count] < 1; count++) {
                if (decimalsLimit <= count + 1) rationalLimit = count + 2;
                result = parseFloat(parseFloat(integer + '.' + decimalsValue.slice(0, rationalLimit + 1).join('')).toFixed(rationalLimit))
            }
        }
    }

    return result;
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Сделай проверку, если целое — не округляй, если дробное — .toPrecision()

https://jsfiddle.net/Lhzq9fgu/
Ответ написан
evgeniy8705
@evgeniy8705
Повелитель вселенной
const toPrecision = (value, fix) => (value ^ 0) !== value ? value.toPrecision(fix) : value;

console.log(toPrecision(0.000027777391980666935, 2)); // 0.000028
console.log(toPrecision(144004, 2)); // 144004
Ответ написан
Комментировать
Задача не формализована.
Из вашего запроса понятно как обрабатывать целые числа больше 1 и дробные меньше 1
Как должно быть обработано число 123124.0000001233 ?
Формализуйте для себя задачу, и решение прийдет само.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы