Удалить незначительные конечные нули из числа?

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

Исх.

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

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

107 голосов | спросил Steven 1 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 01 Sep 2010 00:00:59 +0400 2010, 00:00:59

12 ответов


0

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

var n = 1.245000
var noZeroes = n.toString() // "1.245" 
ответил Cristian Sanchez 1 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 01 Sep 2010 00:47:55 +0400 2010, 00:47:55
0

У меня был похожий экземпляр, где я хотел использовать .toFixed() там, где это необходимо, но я не хотел, чтобы отступы были когда-либо ' т. В итоге я использовал parseFloat вместе с toFixed.

toFixed без дополнения

parseFloat(n.toFixed(4));

Еще один вариант, который делает почти то же самое
Этот ответ может помочь вашему решению

Number(n.toFixed(4));

toFixed округляет /дополняет число до определенной длины, но также преобразует его в строку. Преобразование этого обратно в числовой тип не только сделает число более безопасным для арифметического использования, но также автоматически отбросит любые конечные 0. Например:

var n = "1.234000";
    n = parseFloat(n);
 // n is 1.234 and in number form

Потому что даже если вы определите число с конечными нулями, они будут отброшены.

var n = 1.23000;
 // n == 1.23;
ответил Gary 28 +04002013-10-28T00:38:15+04:00312013bEurope/MoscowMon, 28 Oct 2013 00:38:15 +0400 2013, 00:38:15
0

Сначала я использовал комбинацию ответов Маттилиры и Гэри:

r=(+n).toFixed(4).replace(/\.0+$/,'')

Результаты:

  • 1234870.98762341: "1234870.9876"
  • 1230009100: "1230009100"
  • 0,0012234: "0,0012"
  • 0,1200234; "0,12"
  • 0,000001231: "0"
  • 0.10001: "0.1000"
  • "asdf": "NaN" (поэтому нет ошибки времени выполнения)

Несколько проблемный случай - 0.10001. В итоге я использовал эту более длинную версию:

    r = (+n).toFixed(4);
    if (r.match(/\./)) {
      r = r.replace(/\.?0+$/, '');
    }
  • 1234870.98762341: "1234870.9876"
  • 1230009100: "1230009100"
  • 0,0012234: "0,0012"
  • 0,1200234; "0,12"
  • 0,000001231: "0"
  • 0,10001: "0,1"
  • "asdf": "NaN" (поэтому нет ошибки времени выполнения)

Обновление . Это более новая версия Гэри (см. комментарии):

r=(+n).toFixed(4).replace(/([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)/,'$1')

Это дает те же результаты, что и выше.

ответил w00t 7 SatEurope/Moscow2013-12-07T12:38:02+04:00Europe/Moscow12bEurope/MoscowSat, 07 Dec 2013 12:38:02 +0400 2013, 12:38:02
0

Метод toFixed при необходимости выполнит соответствующее округление. Это также добавит конечные нули, что не всегда идеально.

(4.55555).toFixed(2);
//-> "4.56"

(4).toFixed(2);
//-> "4.00"

Если вы приведете возвращаемое значение к числу, эти конечные нули будут удалены. Это более простой подход, чем выполнение собственной математики округления или усечения.

+(4.55555).toFixed(2);
//-> 4.56

+(4).toFixed(2);
//-> 4
ответил C. J. 1 MonEurope/Moscow2014-12-01T17:54:09+03:00Europe/Moscow12bEurope/MoscowMon, 01 Dec 2014 17:54:09 +0300 2014, 17:54:09
0

Мне нужно было решить и эту проблему, когда Django отображал значения десятичного типа в текстовом поле. Например. когда «1» было значением. Было бы показано «1,00000000». Если значение равно «1.23», оно будет отображать «1.23000000» (в случае значения «decimal_places», равного 8)

Использование parseFloat не было для меня вариантом, поскольку возможно, что оно не возвращает точно такое же значение. toFixed не был опцией, так как я не хотел ничего округлять, поэтому я создал функцию:

function removeTrailingZeros(value) {
    value = value.toString();

    # if not containing a dot, we do not need to do anything
    if (value.indexOf('.') === -1) {
        return value;
    }

    # as long as the last character is a 0 or a dot, remove it
    while((value.slice(-1) === '0' || value.slice(-1) === '.') && value.indexOf('.') !== -1) {
        value = value.substr(0, value.length - 1);
    }
    return value;
}
ответил megasnort 29 J0000006Europe/Moscow 2017, 10:50:15
0

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

В дополнение к обрезке конечных нулей мне также необходимо округлить и при желании отформатировать выходные данные для текущей локали пользователя (т.е. 123 456,789).

Вся моя работа над этим была включена в виде prettyFloat.js (MIT Licensed) на GitHub: https : //github.com/dperish/prettyFloat.js


Примеры использования:

prettyFloat(1.111001, 3) // "1.111"
prettyFloat(1.111001, 4) // "1.111"
prettyFloat(1.1111001, 5) // "1.1111"
prettyFloat(1234.5678, 2) // "1234.57"
prettyFloat(1234.5678, 2, true) // "1,234.57" (en-us)


Обновлено - август 2018 года


Все современные браузеры теперь поддерживают API интернационализации ECMAScript , которая обеспечивает сравнение строк с учетом языка, форматирование чисел и форматирование даты и времени.

let formatters = {
    default: new Intl.NumberFormat(),
    currency: new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 0, maximumFractionDigits: 0 }),
    whole: new Intl.NumberFormat('en-US', { style: 'decimal', minimumFractionDigits: 0, maximumFractionDigits: 0 }),
    oneDecimal: new Intl.NumberFormat('en-US', { style: 'decimal', minimumFractionDigits: 1, maximumFractionDigits: 1 }),
    twoDecimal: new Intl.NumberFormat('en-US', { style: 'decimal', minimumFractionDigits: 2, maximumFractionDigits: 2 })
};

formatters.twoDecimal.format(1234.5678);  // result: "1,234.57"
formatters.currency.format(28761232.291); // result: "$28,761,232"

Для старых браузеров вы можете использовать этот полифилл:

ответил dperish 28 AM00000080000005731 2014, 08:24:57
0

Ни одно из этих решений не помогло мне в очень небольших количествах. http://numeraljs.com/ решил это за меня.

parseFloat(0.00000001.toFixed(8));
// 1e-8

numeral(0.00000001).format('0[.][00000000]');
// "0.00000001"
ответил Devon 25 FebruaryEurope/MoscowbWed, 25 Feb 2015 16:35:45 +0300000000pmWed, 25 Feb 2015 16:35:45 +030015 2015, 16:35:45
0

Чисто регулярное выражение

n.replace(/(\.[0-9]*[1-9])0+$|\.0*$/,'$1');

Интересно, почему никто не дал никому!

ответил João Costa 20 22018vEurope/Moscow11bEurope/MoscowTue, 20 Nov 2018 19:41:43 +0300 2018, 19:41:43
0

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

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

eval(x) --> 1.234
eval(y) --> 1.234001
ответил Moon 24 J0000006Europe/Moscow 2014, 03:09:26
0

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

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;
}
ответил BennyHilarious 1 SatEurope/Moscow2018-12-01T18:38:06+03:00Europe/Moscow12bEurope/MoscowSat, 01 Dec 2018 18:38:06 +0300 2018, 18:38:06
0

Простая математическая альтернатива использованию 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) );
ответил Gary 26 J000000Thursday18 2018, 17:18:46
0

Легко удаляйте конечные нули с помощью big.js . Простой трюк

1.234000 => 1,234

let x = new Big("1.2340000");
x = new Big(x.toFixed(5)); //decide how many decimal digits you want

console.log(x.toString()); //1.234
ответил DhineshYes 18 TueEurope/Moscow2018-12-18T06:38:50+03:00Europe/Moscow12bEurope/MoscowTue, 18 Dec 2018 06:38:50 +0300 2018, 06:38:50

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132