Удалить незначительные конечные нули из числа? - PullRequest
125 голосов
/ 01 сентября 2010

Я пропустил стандартный вызов API, который удаляет завершающие незначительные нули из числа?

Пример.

var x = 1.234000 // to become 1.234;
var y = 1.234001; // stays 1.234001

Number.toFixed () и Number.toPrecision () не совсемчто я ищу.

Ответы [ 15 ]

1 голос
/ 01 декабря 2018

Если вы не можете использовать числа с плавающей точкой по какой-либо причине (например, с привлечением денег) и уже начинаете со строки, представляющей правильное число, вы можете найти это решение удобным. Он преобразует строку, представляющую число, в строку, представляющую число без конечных нулей.

function removeTrailingZeroes( strAmount ) {
    // remove all trailing zeroes in the decimal part
    var strDecSepCd = '.'; // decimal separator
    var iDSPosition = strAmount.indexOf( strDecSepCd ); // decimal separator positions
    if ( iDSPosition !== -1 ) {
        var strDecPart = strAmount.substr( iDSPosition ); // including the decimal separator

        var i = strDecPart.length - 1;
        for ( ; i >= 0 ; i-- ) {
            if ( strDecPart.charAt(i) !== '0') {
                break;
            }
        }

        if ( i=== 0 ) {
            return strAmount.substring(0, iDSPosition);
        } else {
            // return INTPART and DS + DECPART including the rightmost significant number
            return strAmount.substring(0, iDSPosition) + strDecPart.substring(0,i + 1);
        }
    }

    return strAmount;
}
0 голосов
/ 20 июня 2019

Мне нужно было удалить любые конечные нули, но оставить как минимум 2 десятичных знака, , включая любые нули.
Числа, с которыми я работаю, представляют собой 6 строк десятичных чисел, сгенерированных .toFixed (6).

Ожидаемый результат:

var numstra = 12345.000010 // should return 12345.00001
var numstrb = 12345.100000 // should return 12345.10
var numstrc = 12345.000000 // should return 12345.00
var numstrd = 12345.123000 // should return 12345.123

Решение:

var numstr = 12345.100000

while (numstr[numstr.length-1] === "0") {           
    numstr = numstr.slice(0, -1)
    if (numstr[numstr.length-1] !== "0") {break;}
    if (numstr[numstr.length-3] === ".") {break;}
}

console.log(numstr) // 12345.10

Логика:

Запуск функции цикла, если последний символ строки равен нулю.
Удалите последний символ и обновите строковую переменную.
Если последний символ обновленной строки не равен нулю, завершите цикл.
Если обновленная строка с третьего по последний символ является плавающей точкой, завершите цикл.

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

После прочтения всех ответов - и комментариев - я получил следующее:

function isFloat(n) {
    let number = (Number(n) === n && n % 1 !== 0) ? eval(parseFloat(n)) : n;
    return number;
}

Я знаю, что использование eval может быть как-то вредно, но это мне очень помогло.

Итак:

isFloat(1.234000);     // = 1.234;
isFloat(1.234001);     // = 1.234001
isFloat(1.2340010000); // = 1.234001

Если вы хотите ограничить десятичные знаки, используйте toFixed(), как указали другие.

let number = (Number(n) === n && n % 1 !== 0) ? eval(parseFloat(n).toFixed(3)) : n;

Вот и все.

0 голосов
/ 26 июля 2018

Простая математическая альтернатива использованию toFixed

function truncateNumber( num, precision ){
    let c = Math.pow(10,precision);
    return Math.trunc( num*c )/c;
}
    
console.log( truncateNumber(1234.5678, 4) );
console.log( truncateNumber(1234.56, 4) );
0 голосов
/ 24 июня 2014

Вот возможное решение:

var x = 1.234000 // to become 1.234;
var y = 1.234001; // stays 1.234001

eval(x) --> 1.234
eval(y) --> 1.234001
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...