Число форматування завжди показувати два знаки після коми


781

Я хотів би відформатувати свої номери, щоб завжди відображалося 2 знаки після коми, закруглення, де це можливо.

Приклади:

number     display
------     -------
1          1.00
1.341      1.34
1.345      1.35

Я використовую це:

parseFloat(num).toFixed(2);

Але це відображається 1як 1, а не 1.00.


2
Я маю на увазі, якщо я введу 1, це число не відображатиметься як 1,00, але якщо я
введу

1
Я переформулював ваше запитання в те, що я вважаю, що ви шукали. Перевірте, чи я вас правильно зрозумів.
друдж

точне округлення, тобто підтримка. gist.github.com/ArminVieweg/28647e735aa6efaba401
TarranJones


Відповіді:


1116
(Math.round(num * 100) / 100).toFixed(2);

Демонстраційна демонстрація

Зауважте, що він округлятиме до 2 знаків після коми, тому вхід 1.346повернеться 1.35.


6
@Kooilnc: OP хоче 1відображати як 1.00, а 1.341відображати як 1.34.
друдж

49
Не потрібно використовувати round (), оскільки toFixed () округляє його.
Мілан Бабушков

27
toFixed () робить його навколо, але не забувайте, що він повертає рядок ... Тож цей метод дійсно корисний лише для відображення. Якщо ви хочете виконати подальші математичні обчислення на округленому значенні, не використовуйте toFixed ().
TWright

8
Згідно з MDN, Math.round не завжди дасть точні результати через помилки округлення. Я перевірив це за допомогою 1.005, який повинен округнути до 1,01, але він дає 1,00. Використовуйте мою відповідь для постійної точності: stackoverflow.com/a/34796988/3549440 .
Нейт

13
Всю цю відповідь можна звести до (+num).toFixed(2). Він навіть зберігає помилку округлення в оригіналі, дивіться відповідь Нейт .
RobG

321
Number(1).toFixed(2);         // 1.00
Number(1.341).toFixed(2);     // 1.34
Number(1.345).toFixed(2);     // 1.34 NOTE: See andy's comment below.
Number(1.3450001).toFixed(2); // 1.35


1
Останній рядок помилковий. Я спробував це на консолі Chrome, і `` Number (1.365) .toFixed (2) повертає "1,37"
Andre

1
@Andre, Chrome 29.0.1547.57 дає мені 1.34для вираження Number(1.345).toFixed(2).
Дрю Ноакс

1
toFixed робить округлення, яке ви можете бачити майже на кожному тестовому номері.
andy

40
Випадково подав цей останній коментар перед закінченням .. 1.345- приклад числа, який не може бути точно збережено у плаваючій точці, тому я думаю, що причина, що вона не округляється, як ви очікували, полягає в тому, що вона насправді зберігається як число менше 1,345 і він округляється вниз. Якщо ви тестуєте замість цього, (1.34500001).toFixed(2)тоді ви бачите, що він правильно округляється до1.35
Andy

94

Ця відповідь буде невдалою, якщоvalue = 1.005 .

В якості кращого рішення проблеми округлення можна уникнути, використовуючи числа, представлені в експоненціальних позначеннях:

Number(Math.round(1.005+'e2')+'e-2'); // 1.01

Код очищення, як запропонував @Kon, та оригінальний автор:

Number(Math.round(parseFloat(value + 'e' + decimalPlaces)) + 'e-' + decimalPlaces)

Ви можете додати toFixed()в кінці, щоб зберегти десяткову точку, наприклад: 1.00але зауважте, що вона повернеться як рядок.

Number(Math.round(parseFloat(value + 'e' + decimalPlaces)) + 'e-' + decimalPlaces).toFixed(decimalPlaces)

Кредит: Округлення десяткових знаків у JavaScript


13
Дивно, але всі інші тут не побачили, що toFixedце проблема округлення. Ваша відповідь має бути прийнятою.
Armfoot

1
Просто перевірений, чи не все так було. ви все ще правильні для версії Chrome 59.0.3071.115 Ваша розв’язання завершиться на 1,005 (1,01) і знизиться на 1,00499999 (1,00)
Artistan

jsfiddle.net/Artistan/qq895bnp/28 є "часи", коли toFixed буде працювати, але це досить непослідовно. :)
Artistan

оточуючий номер у parseFloat - це його рядок, що повертається
user889030

1
Це тверда відповідь. Пару вдосконалень, про які я можу подумати: (1) Код VS (файл TypeScript) не любить проходження Math.round () в рядку. (2) Зробіть кількість десяткових знаків динамічною (не жорстко закодованою до 2). (3) toFixed () здається непотрібним. Тож, що я придумав, цеNumber(Math.round(parseFloat(value + 'e' + decimalPlaces)) + 'e-' + decimalPlaces)
Кон

23
var num = new Number(14.12);
console.log(num.toPrecision(2));//outputs 14
console.log(num.toPrecision(3));//outputs 14.1
console.log(num.toPrecision(4));//outputs 14.12
console.log(num.toPrecision(5));//outputs 14.120

Це дає несподівані результати, якщо ваше число може бути 1,4, 23,654 і 0, яку точність ви б взяли?
shinzou

2
Зауважте, що ОП просить "округлення, де це можливо" . toPrecisionлише форматує число на певну кількість десяткових знаків, просто залишаючи зайві місця, але не округляючи їх . Звичайно, це може бути дуже корисним, але важливо зрозуміти різницю.
Боаз - Відновіть Моніку

1
Насправді точність дійсно кругла, за словами Mozilla. Тест:(20.55).toPrecision(3) "20.6"
Джеймс Л.

2
Якщо ви хочете зняти нульові нулі , додайте їх до числа чи плавуни після використання toFixed: const formattedVal = Number(val.toFixed(2));Не використовуйте toPrecision, оскільки він враховує недесяткові числа при використанні параметра параметри точності.
Джеймс Л.

17

Для найбільш точного округлення створіть цю функцію:

function round(value, decimals) {
    return Number(Math.round(value +'e'+ decimals) +'e-'+ decimals).toFixed(decimals);
}

і використовувати його для округлення до двох знаків після коми:

console.log("seeked to " + round(1.005, 2));
> 1.01

Завдяки Разу , цій статті та довідці Math.round MDN .


1
що про 1.0049999999999998934?
4esn0k

1
Це не виходить за межі 2 dp
Стівен Аделакун

1
jsfiddle.net/Artistan/qq895bnp перевірений, це єдиний послідовний метод, який я бачив. Дякую.
Артистан

16

Для сучасних браузерів використовуйте toLocaleString:

var num = 1.345;
num.toLocaleString(undefined, { maximumFractionDigits: 2, minimumFractionDigits: 2 });

Укажіть тег локалі як перший параметр для управління десятковою подільником . Для крапки використовуйте, наприклад, англійську мову США:

num.toLocaleString("en-US", { maximumFractionDigits: 2, minimumFractionDigits: 2 });

що дає:

1,35

Більшість країн Європи використовують коску як десятковий роздільник, тому якщо ви, наприклад, використовуєте шведську / шведську мову:

num.toLocaleString("sv-SE", { maximumFractionDigits: 2, minimumFractionDigits: 2 });

це дасть:

1,35


Не впевнений, чому це знищено, мені здалося, що це добре працює. Будь ласка, додайте коментар, якщо ви збираєтесь подати заявку, якщо з цим щось не так!
Джон Кюльвінер

13

Найпростіша відповідь:

var num = 1.2353453;
num.toFixed(2); // 1.24

Приклад: http://jsfiddle.net/E2XU7/


11
Ну, toFixedвже було запропоновано в stackoverflow.com/a/13292833/218196 . Яку додаткову інформацію надає ваше запитання?
Фелікс Клінг

що відповідь не включає кругле функціональність, моя відповідь включає тхо.
macio.Jun

8
А? Це точно та сама відповідь. Дзвінок toFixedна номер.
Фелікс Клінг

1
Правильна, та сама функція, але результат цієї відповіді вводить в оману, я просто виправив її, висловивши круглу функціональність.
macio.Jun

У запитанні зазначено: "... округлення, де це можливо". Ваша відповідь не передбачає округлення.
Кріс

12

Набагато більш загальне рішення для округлення до N місць

function roundN(num,n){
  return parseFloat(Math.round(num * Math.pow(10, n)) /Math.pow(10,n)).toFixed(n);
}


console.log(roundN(1,2))
console.log(roundN(1.34,2))
console.log(roundN(1.35,2))
console.log(roundN(1.344,2))
console.log(roundN(1.345,2))
console.log(roundN(1.344,3))
console.log(roundN(1.345,3))
console.log(roundN(1.3444,3))
console.log(roundN(1.3455,3))

Output

1.00
1.34
1.35
1.34
1.35
1.344
1.345
1.344
1.346

1
Цей показник не вдається з певним числом, близьким до 0, roundN(-3.4028230607370965e+38,2)повертається "-3.4028230607370965e+38"замість очікуваного 0,00
Феррібіг

Цікаво @Ferrybig Я перевіряю згадані вами номери та думаю про вирішення, дякую за тестування
PirateApp

1
Зауважте, що раніше згадане число не повинно показувати нуль, а натомість величезна кількість, це була лише помилка в моєму мозку. Але це все ще не працює, оскільки досі не показує 2 десяткові дроби
Феррібіг


9

Якщо ви вже використовуєте jQuery, ви можете переглянути формат номерів jQuery плагін .

Плагін може повернути відформатовані числа у вигляді рядка, ви можете встановити десяткові та тисячні роздільники, а також ви можете вибрати кількість десяткових знаків для показу.

$.number( 123, 2 ); // Returns '123.00'

Ви також можете отримати jQuery Number Format від GitHub .


11
Зайвим є використання плагіна "просто мати десяткову частину фіксованої довжини".
Lashae

9
@Lashae, звичайно, якщо це все, що ти хочеш зробити. Я розмістив це у випадку, якщо ОП або хтось інший захотів додаткової функціональності, яку надає плагін.
Сем Сенерт

якщо
учасник

7

Це ви маєте на увазі?

function showAsFloat(num, n){
      return !isNaN(+num) ? (+num).toFixed(n || 2) : num;
}

document.querySelector('#result').textContent = 
    [
     'command                      | result',
     '-----------------------------------------------',
     'showAsFloat(1);              | ' + showAsFloat(1),
     'showAsFloat(1.314);          | ' + showAsFloat(1.314),
     'showAsFloat(\'notanumber\')    | ' + showAsFloat('notanumber'),
     'showAsFloat(\'23.44567\', 3)   | ' + showAsFloat('23.44567', 3),
     'showAsFloat(2456198, 5)      | ' + showAsFloat('2456198', 5),
     'showAsFloat(0);              | ' + showAsFloat(0)
    ].join('\n');
<pre id="result"></pre>


6

Перетворіть число в рядок, зберігаючи лише два десяткові дроби:

var num = 5.56789;
var n = num.toFixed(2);

Результатом n буде:

5.57

4

Шукаєте підлогу?

var num = 1.42482;
var num2 = 1;
var fnum = Math.floor(num).toFixed(2);
var fnum2 = Math.floor(num2).toFixed(2);
alert(fnum + " and " + fnum2); //both values will be 1.00

4
Я не думаю, що він хоче округлити до найближчого цілого числа.
друдж

так, я не був впевнений в описі, але я просто викинув його там на
випадок

3
function currencyFormat (num) {
    return "$" + num.toFixed(2).replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,")
}

console.info(currencyFormat(2665));   // $2,665.00
console.info(currencyFormat(102665)); // $102,665.00

3

Ось також загальна функція, яка може форматувати будь-яку кількість десяткових знаків:

function numberFormat(val, decimalPlaces) {

    var multiplier = Math.pow(10, decimalPlaces);
    return (Math.round(val * multiplier) / multiplier).toFixed(decimalPlaces);
}

3

Там, де потрібне конкретне форматування, слід написати власний розпорядок або використовувати функцію бібліотеки, яка виконує все, що вам потрібно. Основна функціональність ECMAScript зазвичай недостатня для відображення відформатованих чисел.

Ретельне пояснення округлення та форматування знаходиться тут: http://www.merlyn.demon.co.uk/js-round.htm#RiJ

Як правило, округлення та форматування повинні бути виконані лише як останній крок перед виведенням. Якщо це зробити раніше, це може ввести несподівано великі помилки і зруйнувати форматування.


Бувають випадки, коли я хитаю головою на власний вибір, щоб настільки глибоко втягнутися в цю всю платформу JS / Ecma. :( "Там, де потрібне конкретне форматування, ви повинні написати власний розпорядок або використовувати функцію бібліотеки, яка виконує те, що вам потрібно. Основна функціональність ECMAScript зазвичай недостатня для відображення відформатованих чисел. але тому, що цей факт існує. Просто сумно. Сядьте на м'яч, Javascript! :)
ChrisH

2

function number_format(string,decimals=2,decimal=',',thousands='.',pre='R$ ',pos=' Reais'){
  var numbers = string.toString().match(/\d+/g).join([]);
  numbers = numbers.padStart(decimals+1, "0");
  var splitNumbers = numbers.split("").reverse();
  var mask = '';
  splitNumbers.forEach(function(d,i){
    if (i == decimals) { mask = decimal + mask; }
    if (i>(decimals+1) && ((i-2)%(decimals+1))==0) { mask = thousands + mask; }
    mask = d + mask;
  });
  return pre + mask + pos;
}
var element = document.getElementById("format");
var money= number_format("10987654321",2,',','.');
element.innerHTML = money;
#format{
display:inline-block;
padding:10px;
border:1px solid #ddd;
background:#f5f5f5;
}
<div id='format'>Test 123456789</div>


2

Просто натисніть на цю найдовшу нитку, нижче моє рішення:

parseFloat(Math.round((parseFloat(num * 100)).toFixed(2)) / 100 ).toFixed(2)

Дайте мені знати, чи хтось може просунути яму


2


2
Цього фрагмента коду вистачить для досягнення вашої вимоги parseFloat(num.toFixed(2))
ква,

1

Ви не даєте нам всієї картини.

javascript:alert(parseFloat(1).toFixed(2))показує 1.00 у моїх браузерах, коли я вставляю його в рядок розташування. Однак якщо ви зробите щось з цим згодом, воно повернеться.

var num = 2
document.getElementById('spanId').innerHTML=(parseFloat(num).toFixed(2)-1)


shows 1 and not 1.00

Працює у FF 50, Chrome 49 та IE 8
Флоріан Штрауб


1

Мені довелося вирішити між перетвореннями parseFloat () та Number (), перш ніж я міг здійснити дзвінок toFixed (). Ось приклад форматування чисел після введення інформації користувача після захоплення.

HTML:

<input type="number" class="dec-number" min="0" step="0.01" />

Обробник подій:

$('.dec-number').on('change', function () {
     const value = $(this).val();
     $(this).val(value.toFixed(2));
});

Вищевказаний код призведе до виключення TypeError. Зауважте, що хоча тип введення html - "число", введення користувача насправді є "рядковим" типом даних. Однак функцію toFixed () можна викликати лише на об'єкті, який є числом.

Мій кінцевий код виглядатиме так:

$('.dec-number').on('change', function () {
     const value = Number($(this).val());
     $(this).val(value.toFixed(2));
});

Причина, якою я віддаю перевагу при передачі номера () проти parseFloat (), полягає в тому, що мені не потрібно виконувати додаткові перевірки ні для порожнього вхідного рядка, ні для значення NaN. Функція Number () автоматично оброблятиме порожній рядок і приховуватиме його до нуля.


0

Мені подобається:

var num = 12.749;
parseFloat((Math.round(num * 100) / 100).toFixed(2)); // 123.75

Заокруглюйте число двома знаками після коми, а потім переконайтесь, що їх розбирають, parseFloat() щоб повернути число, а не рядок, якщо вам не байдуже, чи це рядок чи номер.


Я думаю, якщо метою було відображення з точністю до 2 десяткових знаків, розбір поплавця зіпсується з цим. Напр.parseFloat("1.00") // 1
Штійн де Вітт

0

Розширити об'єкт Math точним методом

Object.defineProperty(Math, 'precision',{
   value: function (value,precision,type){
             var v = parseFloat(value),
                 p = Math.max(precision,0)||0,
                 t = type||'round';
              return (Math[t](v*Math.pow(10,p))/Math.pow(10,p)).toFixed(p);
          }
    });

console.log(
    Math.precision(3.1,3), // round 3 digits 
    Math.precision(0.12345,2,'ceil'), // ceil 2 digits
    Math.precision(1.1) // integer part
)



0

ось ще одне рішення округлення лише за допомогою підлоги, тобто переконання, що розрахункова сума не буде перевищувати початкову суму (іноді необхідну для транзакцій):

Math.floor(num* 100 )/100;

0

Ви можете спробувати цей код:

    function FormatNumber(number, numberOfDigits = 2) {
        try {
            return new Intl.NumberFormat('en-US').format(parseFloat(number).toFixed(2));
        } catch (error) {
            return 0;
        }
    }

    var test1 = FormatNumber('1000000.4444');
    alert(test1); // 1,000,000.44

    var test2 = FormatNumber(100000000000.55555555, 4);
    alert(test2); // 100,000,000,000.56

0

Спробуйте нижче код:

function numberWithCommas(number) { 

   var newval = parseFloat(Math.round(number * 100) / 100).toFixed(2);

   return newval.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.