Số định dạng để luôn hiển thị 2 chữ số thập phân


783

Tôi muốn định dạng số của mình để luôn hiển thị 2 chữ số thập phân, làm tròn số nếu có.

Ví dụ:

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

Tôi đã được sử dụng này:

parseFloat(num).toFixed(2);

Nhưng nó hiển thị 1như 1, hơn là 1.00.


2
Ý tôi là nếu tôi nhập 1 thì nó sẽ không hiển thị số là 1,00, nhưng nếu tôi nhập 1.345 thì nó sẽ hiển thị 1.35
Varada

1
Tôi đã đặt lại câu hỏi của bạn cho những gì tôi tin rằng bạn đang tìm kiếm. Vui lòng kiểm tra để đảm bảo rằng tôi đã hiểu đúng về bạn.
vét

làm tròn chính xác với sự hỗ trợ tức là. gist.github.com/ArminVieweg/28647e735aa6efaba401
TarranJones


Câu trả lời:


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

Bản thử trực tiếp

Lưu ý rằng nó sẽ làm tròn đến 2 chữ số thập phân, vì vậy đầu vào 1.346sẽ trở lại 1.35.


6
@Kooilnc: OP muốn 1hiển thị dưới dạng 1.001.341hiển thị dưới dạng 1.34.
vét

49
Không cần sử dụng round () kể từ toFixed () làm tròn nó.
Milan Babuškov

27
toFixed () làm tròn nó nhưng đừng quên nó trả về một chuỗi ... Vì vậy, phương thức này thực sự chỉ hữu ích để hiển thị. Nếu bạn muốn thực hiện các tính toán toán học tiếp theo trên giá trị làm tròn, không sử dụng toFixed ().
TWright

8
theo MDN, Math.round sẽ không luôn cho kết quả chính xác do lỗi làm tròn. Tôi đã thử nghiệm điều này với 1,005, sẽ làm tròn thành 1,01, nhưng nó cho 1,00. Sử dụng câu trả lời của tôi để có độ chính xác phù hợp: stackoverflow.com/a/34796988/3549440 .
Nate

13
Toàn bộ câu trả lời này có thể được giảm xuống (+num).toFixed(2). Nó thậm chí còn giữ lại lỗi làm tròn trong bản gốc, xem câu trả lời của Nate .
RobG

322
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
Dòng cuối cùng là sai. Tôi đã thử điều này trong bảng điều khiển Chrome và `` Number (1.365) .toFixed (2) trả về "1.37"
Andre

1
@Andre, Chrome 29.0.1547.57 cho tôi 1.34biểu hiện Number(1.345).toFixed(2).
Drew Noakes

1
toFixed thực hiện làm tròn, mà bạn có thể thấy trên hầu hết mọi số kiểm tra.
andy

40
Vô tình gửi bình luận cuối cùng trước khi kết thúc .. 1.345là một ví dụ về một số không thể được lưu trữ chính xác trong dấu phẩy động, vì vậy tôi nghĩ lý do mà nó không tròn như bạn mong đợi, là nó thực sự được lưu trữ dưới dạng một số hơi ít hơn 1.345 và nó làm tròn xuống. Nếu bạn kiểm tra thay vì với (1.34500001).toFixed(2)sau đó bạn nhìn thấy nó một cách chính xác đạn lên đến1.35
andy

94

Câu trả lời này sẽ thất bại nếuvalue = 1.005 .

Là một giải pháp tốt hơn, vấn đề làm tròn có thể tránh được bằng cách sử dụng các số được biểu thị trong ký hiệu số mũ:

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

Mã sạch hơn theo đề xuất của @Kon và tác giả gốc:

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

Bạn có thể thêm toFixed()vào cuối để giữ lại dấu thập phân, ví dụ: 1.00nhưng lưu ý rằng nó sẽ trả về dưới dạng chuỗi.

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

Tín dụng: Làm tròn số thập phân trong JavaScript


13
Thật ngạc nhiên, tất cả những người khác ở đây đã thất bại khi thấy toFixedcó vấn đề làm tròn đó. Câu trả lời của bạn nên được chấp nhận.
Armfoot

1
Chỉ cần thử nghiệm để xem nếu đây vẫn là trường hợp. bạn vẫn đúng cho Chrome Phiên bản 59.0.3071.115 Giải pháp của bạn sẽ làm tròn cho 1.005 (1.01) và làm tròn cho 1.00499999 (1.00)
Artistan

jsfiddle.net/Artistan/qq895bnp/28 có "thời gian" khi toFixed sẽ hoạt động, nhưng nó không nhất quán. :)
Artistan

Số bao quanh trong parseFloat là chuỗi trả về của nó
user889030

1
Đây là một câu trả lời chắc chắn. Một vài cải tiến tôi có thể nghĩ đến: (1) Mã VS (tệp TypeScript) không giống như Math.round () truyền trong một chuỗi. (2) Tạo số lượng vị trí thập phân động (không được mã hóa cứng thành 2). (3) toFixed () dường như không cần thiết. Vì vậy, những gì tôi nghĩ ra làNumber(Math.round(parseFloat(value + 'e' + decimalPlaces)) + 'e-' + decimalPlaces)
Kon

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

Điều đó mang lại kết quả bất ngờ, nếu số của bạn có thể là 1,4 và 23,654 và 0, bạn sẽ lấy độ chính xác nào?
shinzou

2
Lưu ý OP đang yêu cầu "làm tròn nếu có" . toPrecisionchỉ định dạng số cho một số vị trí thập phân cụ thể, chỉ cần bỏ đi những chỗ thừa, nhưng không làm tròn chúng . Điều này có thể rất hữu ích tất nhiên, nhưng điều quan trọng là phải hiểu sự khác biệt.
Boaz - Tái lập Monica

1
Trên thực tế, toPrecision không làm tròn, theo Mozilla. Kiểm tra:(20.55).toPrecision(3) "20.6"
James L.

2
Nếu bạn muốn xóa các số 0 ở cuối , hãy chuyển nó thành Số hoặc Nổi sau khi sử dụng toFixed: const formattedVal = Number(val.toFixed(2));Không sử dụng toPrecision, vì nó đếm các số không thập phân khi sử dụng tham số chính xác.
James L.

17

Để làm tròn chính xác nhất, hãy tạo chức năng này:

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

và sử dụng nó để làm tròn đến 2 chữ số thập phân:

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

Nhờ Razu , này bài viết, và tài liệu tham khảo Math.round MDN của .


1
1.0049999999999998934 thì sao?
4esn0k

1
Nó không vượt quá 2 dp
Stephen Adelakun 4/10/2016

1
jsfiddle.net/Artistan/qq895bnp đã thử nghiệm, đây là phương pháp nhất quán duy nhất tôi đã thấy. Cảm ơn.
Artistan

17

Đối với các trình duyệt hiện đại, sử dụng toLocaleString:

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

Chỉ định thẻ ngôn ngữ làm tham số đầu tiên để kiểm soát dấu tách thập phân . Đối với một dấu chấm, sử dụng ví dụ tiếng Anh US locale:

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

cung cấp cho:

1,35

Hầu hết các quốc gia ở Châu Âu sử dụng dấu phẩy làm dấu phân cách thập phân, vì vậy, nếu bạn sử dụng ngôn ngữ Thụy Điển / Thụy Điển:

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

nó sẽ cho:

1,35


Không chắc chắn tại sao điều này bị hạ cấp, nó dường như hoạt động tốt với tôi. Vui lòng thêm một bình luận nếu bạn có ý định downvote nếu có gì đó không ổn với điều này!
John Culviner

13

Câu trả lời đơn giản nhất:

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

Ví dụ: http://jsfiddle.net/E2XU7/


11
Vâng, toFixedđã được đề xuất trong stackoverflow.com/a/13292833/218196 . Câu hỏi nào cung cấp thêm thông tin?
Felix Kling

câu trả lời đó không bao gồm chức năng tròn, câu trả lời của tôi bao gồm tho.
macio.Jun

8
Ừm Đó chính xác là cùng một câu trả lời. Gọi toFixedvào một số.
Felix Kling

1
Đúng, cùng chức năng, nhưng kết quả của câu trả lời đó là sai lệch, tôi chỉ sửa nó bằng cách thể hiện chức năng tròn.
macio.Jun

Câu hỏi nêu rõ: "... làm tròn khi áp dụng". Câu trả lời của bạn không liên quan đến làm tròn.
Chris

12

Một giải pháp chung chung hơn nhiều để làm tròn đến N địa điểm

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
Việc thay đổi này không thành công với các số nhất định gần bằng 0, roundN(-3.4028230607370965e+38,2)trả về "-3.4028230607370965e+38"thay vì 0,00 dự kiến
Ferrybig

thú vị @Ferrybig tôi sẽ kiểm tra các số bạn đã đề cập và nghĩ đến một cách giải quyết, cảm ơn vì đã thử nghiệm
PirateApp

1
Lưu ý rằng số được đề cập trước đó không nên hiển thị bằng 0, nhưng thay vào đó là một số rất lớn, đây chỉ là một lỗi trong não của tôi. Nhưng nó vẫn không hoạt động, vì nó vẫn không hiển thị 2 số thập phân
Ferrybig


9

Nếu bạn đã sử dụng jQuery, bạn có thể xem xét sử dụng plugin Định dạng số jQuery .

Plugin có thể trả về các số được định dạng dưới dạng chuỗi, bạn có thể đặt thập phân và hàng nghìn dấu phân cách và bạn có thể chọn số thập phân để hiển thị.

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

Bạn cũng có thể nhận được Định dạng số jQuery từ GitHub .


11
Việc sử dụng một plugin "chỉ để có phần thập phân có độ dài cố định" là quá mức cần thiết.
Lashae

9
@Lashae, chắc chắn, nếu đó là tất cả những gì bạn muốn làm. Tôi đã đăng bài này trong trường hợp OP hoặc bất kỳ ai khác muốn có thêm chức năng mà plugin cung cấp.
Sam Sehnert

nếu poster của câu hỏi đã thêm thẻ jQuery tất nhiên;)
fullstacklife 30/03/2015

7

Ý bạn là vậy đúng không?

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

Chuyển đổi một số thành một chuỗi, chỉ giữ hai số thập phân:

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

Kết quả của n sẽ là:

5.57

4

Bạn đang tìm kiếm sàn?

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
Tôi không nghĩ anh ấy muốn làm tròn số nguyên gần nhất.
vét

vâng, tôi không chắc chắn từ mô tả, nhưng tôi chỉ ném nó ra ngoài đó
samwise

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

Đây cũng là một hàm chung có thể định dạng cho bất kỳ số thập phân nào:

function numberFormat(val, decimalPlaces) {

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

3

Khi cần định dạng cụ thể, bạn nên viết thói quen của riêng mình hoặc sử dụng chức năng thư viện thực hiện những gì bạn cần. Chức năng ECMAScript cơ bản thường không đủ để hiển thị các số được định dạng.

Một lời giải thích kỹ lưỡng về làm tròn và định dạng là ở đây: http://www.merlyn.demon.co.uk/js-round.htmlm#RiJ

Theo nguyên tắc chung, làm tròn và định dạng chỉ nên được xác định là bước cuối cùng trước khi xuất. Làm như vậy sớm hơn có thể giới thiệu các lỗi lớn bất ngờ và phá hủy định dạng.


Có những lúc tôi lắc đầu với sự lựa chọn của riêng mình để tham gia quá sâu vào sự muộn màng trong toàn bộ nền tảng JS / Ecma này. :( "Khi cần định dạng cụ thể, bạn nên viết thói quen của riêng mình hoặc sử dụng chức năng thư viện thực hiện những gì bạn cần. Chức năng ECMAScript cơ bản thường không đủ để hiển thị các số được định dạng." Thật là một câu lệnh asinine - không phải là bạn đã tạo ra nó, nhưng bởi vì thực tế đó tồn tại. Chỉ buồn thôi. Hãy lên bóng, 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

Chỉ cần chạy vào một trong những chuỗi dài nhất, dưới đây là giải pháp của tôi:

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

Hãy cho tôi biết nếu ai đó có thể chọc một lỗ


2


2
Đoạn mã này đủ để đạt được yêu cầu của bạn parseFloat(num.toFixed(2))
kva

1

Bạn không cho chúng tôi toàn bộ hình ảnh.

javascript:alert(parseFloat(1).toFixed(2))hiển thị 1,00 trong trình duyệt của tôi khi tôi dán vào int0 thanh vị trí. Tuy nhiên nếu bạn làm một cái gì đó với nó sau đó, nó sẽ trở lại.

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


shows 1 and not 1.00

Hoạt động trong FF 50, Chrome 49 và IE 8
Florian Straub

1
var quantity = 12;

var import1 = 12.55;

var total = quantity * import1;

var answer = parseFloat(total).toFixed(2);

document.write(answer);

1

Tôi đã phải quyết định giữa các chuyển đổi parseFloat () và Number () trước khi tôi có thể thực hiện cuộc gọi toFixed (). Đây là một ví dụ về định dạng số đầu vào người dùng sau khi chụp.

HTML:

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

Xử lý sự kiện:

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

Đoạn mã trên sẽ dẫn đến ngoại lệ TypeError. Lưu ý rằng mặc dù kiểu đầu vào html là "số", nhưng đầu vào của người dùng thực sự là kiểu dữ liệu "chuỗi". Tuy nhiên, hàm toFixed () chỉ có thể được gọi trên một đối tượng là Số.

Mã cuối cùng của tôi sẽ trông như sau:

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

Lý do tôi thích sử dụng với Số () so với parseFloat () là vì tôi không phải thực hiện xác thực bổ sung cho cả chuỗi đầu vào trống, cũng như giá trị NaN. Hàm Number () sẽ tự động xử lý một chuỗi rỗng và biến nó thành 0.


0

Tôi có thích:

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

Làm tròn số với 2 điểm thập phân, sau đó đảm bảo phân tích số đó parseFloat() để trả về Số, không phải Chuỗi trừ khi bạn không quan tâm nếu đó là Chuỗi hoặc Số.


Tôi đoán nếu mục đích là để hiển thị với độ chính xác 2 số thập phân, phân tích cú pháp float sẽ gây rối với điều đó. Ví dụ:parseFloat("1.00") // 1
Stijn de Witt

0

Mở rộng đối tượng Math bằng phương pháp chính xác

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

Đây là một giải pháp khác để làm tròn chỉ bằng cách sử dụng sàn, có nghĩa là, đảm bảo số tiền được tính sẽ không lớn hơn số tiền ban đầu (đôi khi cần thiết cho các giao dịch):

Math.floor(num* 100 )/100;

0

Bạn có thể thử mã này:

    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

Hãy thử mã dưới đây:

function numberWithCommas(number) { 

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

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


-3

Đây là cách tôi giải quyết vấn đề của mình:

parseFloat(parseFloat(floatString).toFixed(2));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.