Sayıyı her zaman 2 ondalık basamak gösterecek şekilde biçimlendir


782

Numaralarımı her zaman 2 ondalık basamak gösterecek şekilde biçimlendirmek istiyorum, uygun olduğunda yuvarlama.

Örnekler:

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

Bunu kullanıyorum:

parseFloat(num).toFixed(2);

Ancak , yerine 1olarak görüntüleniyor .11.00


2
Yani 1
girersem

1
Sorunu aradığına inandığım şeye yeniden yazdım. Lütfen sizi doğru anladığımdan emin olun.
köle



Yanıtlar:


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

Canlı Demo

2 ondalık basamağa yuvarlanacağına dikkat edin , böylece giriş 1.346geri dönecektir 1.35.


6
@Kooilnc: OP istediği 1şekilde görüntülemek için 1.00, ve 1.341olarak gösterilecek 1.34.
köle

49
ToFixed () yuvarladığından round () kullanmaya gerek yoktur.
Milan Babuškov

27
toFixed () yuvarlar, ancak bir dize döndürdüğünü unutmayın ... Bu yöntem gerçekten yalnızca görüntüleme için kullanışlıdır. Yuvarlanan değer üzerinde daha fazla matematiksel hesaplamalar yapmak istiyorsanız toFixed () öğesini kullanmayın.
TWright

8
MDN'ye göre, Math.round yuvarlama hataları nedeniyle her zaman doğru sonuçlar vermeyecektir. Bunu 1.01'e yuvarlaması gereken 1.005 ile test ettim, ancak 1.00 veriyor. Cevabımı tutarlı doğruluk için kullanın: stackoverflow.com/a/34796988/3549440 .
Nate

13
Bu yanıtın tamamı azaltılabilir (+num).toFixed(2). Orijinalindeki yuvarlama hatasını bile korur, bkz Nate'in cevabı .
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
Son satır yanlış. Bunu Chrome konsolunda denedim ve `` Number (1.365) .toFixed (2), "1.37" değerini döndürür
Andre

1
@Andre, Chrome 29.0.1547.57 1.34ifadeyi bana veriyor Number(1.345).toFixed(2).
Drew Noakes

1
toFixed , neredeyse her test numarasında görebileceğiniz yuvarlama yapar .
andy

40
Yanlışlıkla bitirmeden önce son yorum gönderdi .. 1.345tam olarak kayan noktada saklanamayan bir sayı örneği, bu yüzden sanırım beklediğiniz gibi yuvarlanma nedeni, aslında biraz sayı olarak saklanması 1.345'ten az ve aşağı yuvarlar. Bunun yerine test (1.34500001).toFixed(2)ederseniz, doğru bir şekilde1.35
andy

94

Eğer bu cevap başarısız olur value = 1.005.

Daha iyi bir çözüm olarak, yuvarlama problemi üstel gösterimde temsil edilen sayılar kullanılarak önlenebilir:

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

@Kon tarafından önerildiği gibi daha temiz kod ve orijinal yazar:

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

toFixed()Ondalık noktayı korumak için sonuna ekleyebilirsiniz , örneğin: 1.00ancak dize olarak döneceğini unutmayın.

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

Kredi bilgileri: JavaScript'te Ondalık Sayıları Yuvarlama


13
Şaşırtıcı bir şekilde, buradaki herkes toFixedbunun yuvarlama problemi olduğunu göremedi . Cevabınız kabul edilen cevap olmalıdır.
Armfoot

1
Sadece durumun hala böyle olup olmadığını test ettim. 59.0.3071.115 Chrome Sürümü için hala haklısınız Çözümünüz 1.005 (1.01) ve 1.00499999 (1.00) için yuvarlanacak
Artistan

jsfiddle.net/Artistan/qq895bnp/28 toFixed'in çalışacağı zamanlar vardır, ancak oldukça tutarsızdır. :)
Artistan

parseFloat içindeki surround Numarası dönen dizesidir
user889030

1
Bu sağlam bir cevap. Düşünebileceğim birkaç gelişme: (1) VS Kodu (TypeScript dosyası), bir dizede geçen Math.round () 'u sevmez. (2) Ondalık basamak sayısını dinamik yapın (2'ye sabit kodlanmamış). (3) toFixed () gereksiz görünüyor. Ben geldiğim 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

Bu beklenmedik sonuçlar verir, eğer numaranız 1.4 ve 23.654 ve 0 olabilirse, hangi hassasiyeti alırsınız?
shinzou

2
OP'nin "uygun olduğunda yuvarlama" istediğini unutmayın . toPrecisionsayıyı yalnızca belirli sayıda ondalık basamağa biçimlendirir, yalnızca gereksiz yerleri dışarıda bırakır, ancak yuvarlamaz . Bu elbette çok yararlı olabilir, ancak farkı anlamak önemlidir.
Boaz - Monica'yı eski

1
Mozilla'ya göre aslında toPrecision yuvarlak. Test:(20.55).toPrecision(3) "20.6"
James L.

2
İsterseniz ardarda sıfırları şerit , bir Number için döküm veya Float kullandıktan sonra toFixed: const formattedVal = Number(val.toFixed(2));Do kullanmayın toPrecisionhassas param kullanırken dışı ondalık sayılar sayar gibi.
James L.

17

En doğru yuvarlama için bu işlevi oluşturun:

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

ve 2 ondalık basamağa yuvarlamak için kullanın:

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

Sayesinde Razu , bu yazıda ve MDN en Math.round referansı .


1
1.0049999999999998934 hakkında ne?
4esn0k

1
2
dp'nin

1
jsfiddle.net/Artistan/qq895bnp test edildi, gördüğüm tek tutarlı yöntem bu. Teşekkürler.
Artistan

16

Modern tarayıcılar için toLocaleStringşunları kullanın :

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

Ondalık ayırıcıyı kontrol etmek için ilk parametre olarak bir yerel ayar etiketi belirtin . Nokta için, örneğin İngilizce ABD yerel ayarını kullanın:

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

hangi verir:

1.35

Avrupa'daki çoğu ülke ondalık ayırıcı olarak virgül kullanır, bu nedenle örneğin İsveç / İsveç yerel ayarını kullanırsanız:

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

verecek:

1,35


Bunun neden reddedildiğinden emin değilim, benim için iyi çalışıyor gibi görünüyordu. Bu konuda bir sorun olup olmadığını azaltmak istiyorsanız lütfen bir yorum ekleyin!
John Culviner

13

En basit cevap:

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

Örnek: http://jsfiddle.net/E2XU7/


11
Şey, stackoverflow.com/a/13292833/218196 adresindetoFixed zaten önerildi . Sorunuz hangi ek bilgileri sağlıyor?
Felix Kling

bu cevap yuvarlak işlevsellik içermez, cevabım tho içerir.
macio.Haziran

8
Ah? Aynı cevap. toFixedBir numarayı arıyorum .
Felix Kling

1
Doğru, aynı işlev, ancak bu cevabın sonucu yanıltıcı, sadece yuvarlak işlevselliği ifade ederek düzelttim.
macio.Haziran

Soru şunu belirtiyor: "... uygun olduğunda yuvarlama". Cevabınız yuvarlamayı içermiyor.
Chris

12

N yere yuvarlamak için çok daha genel bir çözü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
Bu alswer 0'a yakın belirli sayılarla başarısız oluyor , beklenen 0.00 yerine roundN(-3.4028230607370965e+38,2)geri dönüyor"-3.4028230607370965e+38"
Ferrybig

ilginç @Ferrybig bahsettiğiniz sayıları test edeceğim ve bir geçici çözüm düşüneceğim, test için teşekkürler
PirateApp

1
Daha önce belirtilen sayının sıfır göstermemesi gerektiğini, ancak bunun yerine büyük bir sayı olduğunu unutmayın, bu sadece beynimdeki bir hataydı. Ancak hala 2 ondalık göstermediği için hala çalışmıyor
Ferrybig


9

Zaten jQuery kullanıyorsanız, jQuery Sayı Biçimi eklentisini kullanarak bakabilirsiniz .

Eklenti, biçimlendirilmiş sayıları dize olarak döndürebilir, ondalık ve binlik ayırıcı ayarlayabilirsiniz ve gösterilecek ondalık sayıları seçebilirsiniz.

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

GitHub'dan jQuery Sayı Formatını da alabilirsiniz .


11
"Sabit uzunlukta ondalık parçaya sahip olmak" için bir eklenti kullanmak gereğinden fazladır.
Lashae

9
@Lashae, elbette, eğer yapmak istediğin bu ise. OP veya başka herhangi bir eklenti de sağladığı ekstra işlevsellik istediği takdirde bunu yayınladı.
Sam Sehnert

sorunun posteri elbette jQuery etiketini eklediyse;)
fullstacklife 30:15

7

Demek istediğin bu mu?

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

Bir sayıyı yalnızca iki ondalık basamak tutarak dizeye dönüştürün:

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

N'nin sonucu şöyle olacaktır:

5.57

4

Zemin mi arıyorsunuz?

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
En yakın tam sayıya yuvarlamak istediğini sanmıyorum.
köle

Evet, açıklamadan emin değildim, ama sadece oraya fırlatıyordum
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

Ayrıca, herhangi bir sayıda ondalık basamağa biçimlendirebilen genel bir işlev de vardır:

function numberFormat(val, decimalPlaces) {

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

3

Özel biçimlendirme gerektiğinde, kendi rutininizi yazmalı veya ihtiyacınız olanı yapan bir kütüphane işlevi kullanmalısınız. Temel ECMAScript işlevi, biçimlendirilmiş sayıları görüntülemek için genellikle yetersizdir.

Yuvarlama ve biçimlendirme hakkında ayrıntılı açıklama burada: http://www.merlyn.demon.co.uk/js-round.htm#RiJ

Genel bir kural olarak, yuvarlama ve biçimlendirme yalnızca çıktıdan önceki son adım olarak gerçekleştirilmelidir. Bunu daha önce yapmak beklenmedik derecede büyük hatalar verebilir ve biçimlendirmeyi yok edebilir.


Bu JS / Ecma platformunun tamamında bu kadar derin bir şekilde yer almak için kendi seçimime göre başımı salladığım zamanlar var. :( "Belirli biçimlendirmenin gerekli olduğu yerlerde, kendi yordamınızı yazmalı veya ihtiyacınız olanı yapan bir kütüphane işlevi kullanmalısınız. Temel ECMAScript işlevselliği, biçimlendirilmiş sayıları görüntülemek için genellikle yetersizdir." Ne asinine deyimi - sizin yaptığınız değil, ama bu gerçek var olduğu için, sadece üzücü. Topa
bin

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

Sadece bu en uzun iplik biri içine koşmak, aşağıda benim çözüm:

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

Birinin bir delik açıp açamadığını bana bildirin


2


2
Bu kod parçası gereksiniminizi karşılamak için yeterli parseFloat(num.toFixed(2))
kva

1

Bize resmin tamamını vermiyorsunuz.

javascript:alert(parseFloat(1).toFixed(2))konum çubuğuna int0 yapıştırdığımda tarayıcılarımda 1.00 gösteriyor. Ancak daha sonra ona bir şey yaparsanız, geri döner.

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


shows 1 and not 1.00

FF 50, Chrome 49 ve IE 8'de çalışır
Florian Straub

1
var quantity = 12;

var import1 = 12.55;

var total = quantity * import1;

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

document.write(answer);

1

Ben toFixed () çağrı yapmadan önce parseFloat () ve Number () dönüşümleri arasında karar vermek zorunda kaldı. Aşağıda, yakalama sonrası kullanıcı girişini biçimlendiren bir sayı örneği verilmiştir.

HTML:

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

Olay işleyicisi:

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

Yukarıdaki kod, TypeError istisnasına neden olacaktır. Html giriş türü "sayı" olmasına rağmen, kullanıcı girişinin aslında bir "dize" veri türü olduğunu unutmayın. Ancak, toFixed () işlevi yalnızca Sayı olan bir nesnede çağrılabilir.

Son kodum aşağıdaki gibi görünecektir:

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

Ben parseFloat () vs Number () ile döküm tercih sebebi ne boş bir giriş dizesi, ne de NaN değeri için ekstra bir doğrulama yapmak zorunda değilsiniz. Number () işlevi otomatik olarak boş bir dizeyi işleyecek ve sıfıra çevirecektir.


0

Seviyorum:

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

Sayıyı 2 ondalık nokta ile yuvarlayın, ardından parseFloat() Dize veya Sayı olup olmadığını umursamadığınızda Dize değil Sayı döndürmek için ayrıştırdığınızdan emin olun .


Amacın 2 ondalık hassasiyetle görüntülenip görüntülenmeyeceğini, şamandıranın ayrıştırılmasıyla uğraşacaktı. ÖrparseFloat("1.00") // 1
Stijn de Witt

0

Math nesnesini hassas yöntemle genişletme

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

burada yalnızca zemini kullanarak yuvarlamak için başka bir çözüm, yani hesaplanan miktarın orijinal miktardan daha büyük olmayacağından emin olmak (bazen işlemler için gerekli olabilir):

Math.floor(num* 100 )/100;

0

Bu kodu deneyebilirsiniz:

    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

Aşağıdaki kodu deneyin:

function numberWithCommas(number) { 

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

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


-3

Sorunumu şu şekilde çözerim:

parseFloat(parseFloat(floatString).toFixed(2));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.