Javascript'te iki ondalık basamakla float nasıl ayrıştırılır?


411

Takip koduna sahibim. Fiyat_sonucu bir tamsayıya eşitse, 10 diyelim, o zaman iki ondalık basamak eklemek istiyorum. Yani 10, 10.00 olur. Veya 10.6'ya eşitse 10.60 olur. Bunu nasıl yapacağınızdan emin değilim.

price_result = parseFloat(test_var.split('$')[1].slice(0,-1));

Yanıtlar:


915

Bunu yapmak için toFixed () kullanabilirsiniz

var twoPlacedFloat = parseFloat(yourString).toFixed(2)

1
yardımcı olmaktan ve "her gün yeni bir şey öğrenmek" için iyi çalışmaya devam
etmekten mutluluk duyuyorum

3
toFixed olsa da oldukça adamcağız. Ayrıca, burada
w3schools

125
ancak toFixed (), sayıyı dize olarak döndürür; sayıları karşılaştırırsanız, parseFloat öğesini tekrar kullanmanız gerekir.
Pedro Muniz

19
var twoPlacedFloat = + parseFloat(yourString).toFixed(2)Şamandıraya dönüştürmek için kullanın
Jose Rui Santos

13
Dize yerine bir sayı almak için parens ekleyin: parseFloat ((yourString) .toFixed (2));
pvanallen

50

Kullandığınızda toFixed, değeri her zaman dize olarak döndürür. Bu bazen kodu zorlaştırır. Bundan kaçınmak için, Number için alternatif bir yöntem yapabilirsiniz.

Number.prototype.round = function(p) {
  p = p || 10;
  return parseFloat( this.toFixed(p) );
};

ve kullan:

var n = 22 / 7; // 3.142857142857143
n.round(3); // 3.143

ya da sadece:

(22/7).round(3); // 3.143

Bir alışveriş sepeti programı yazdım ve toFixed () ve parseFloat () yöntemine zincirlenmiş round () yöntemlerini kullanmayı denedim. Bu yöntemlerin hiçbiri parseFloat () ile çalışmadı.
Chris22

Bu bana başım ağrıyor. Sadece bunun için +1. Sayıları dizgilere çevireceğine dair hiçbir fikrim yoktu.
Lukas

@Lukas değil mi, eğer parseFloat
Vlada

'2.00' numarasına başvurursam bu 2 değerini döndürür
Saurin Dashadia

Bu yöntem biçimlendirme için değil düzeltmeler içindir. Örneğin: 0.1 + 0.2 // 0.30000000000000004bu yüzden bunun için düzeltmeye ihtiyacım var(0.1+0.2).round() // 0.3
Vlada

47

Performansa ihtiyacınız varsa (oyunlarda olduğu gibi):

Math.round(number * 100) / 100

ParseFloat'tan yaklaşık 100 kat daha hızlı (number.toFixed (2))

http://jsperf.com/parsefloat-tofixed-vs-math-round


5
Yukarıdaki formül '2.00' ile 2. değerini döndürür ancak 2.00 olmasını istiyorum.
Saurin Dashadia

5
Her iki yöne de sahip olamazsınız. Çıktının dize yerine bir sayı olmasını istiyorsanız, sondaki sıfırları alamazsınız. Böylece, yukarıdaki bir dizeye dönüştürülmüş kullanabilirsiniz: var twoPlacedFloat = (Math.round (2.002745 * 100) / 100) .toFixed (2);
pvanallen

3
100'leri 200'lere değiştirirsem hız artar mı?
alashow

Kayan nokta işlemlerinin sayısı aynı kalırsan hız dolayısıyla, aynı olacaktır
Rob BOERMAN

neden basit bir number * 1şey eksik belki missing?
ncubica

11

Bir sayı döndürmek için başka bir parantez katmanı ekleyin. Temiz tutar.

var twoPlacedFloat = parseFloat((10.02745).toFixed(2));

2
Formülünüzde bir şey mi eksik? var twoPlacedFloat = parseFloat(('2.00').toFixed(2))hata üretir.
Saurin Dashadia

üzgünüm, bir sayı yerine dize değişkeni vardı, toFixed () gereken - şimdi düzeltildi. Ancak Rob'un Math.round kullanarak verdiği cevap, performans açısından dikkate alınması gereken bir şeydir.
pvanallen

Bu Vlada'nın cevabına bir yorum olmalı.
Rodrirokr

5

Hedefiniz ayrıştırmaksa ve girdiniz bir değişmez olabilirse, a'yı beklersiniz floatve toFixedbunu sağlamazsınız, bu nedenle bunu sağlamak için iki basit işlev vardır:

function parseFloat2Decimals(value) {
    return parseFloat(parseFloat(value).toFixed(2));
}

function parseFloat2Decimals(value,decimalPlaces) {
    return parseFloat(parseFloat(value).toFixed(decimalPlaces));
}

2
Bu beklendiği gibi çalışmaz. parseFloat(parseFloat('10.5').toFixed(2))geri dönüş 10.5bekleniyor 10.50. Ayrıca parseFloat(parseFloat('10.50').toFixed(2))dönüş10.5
MTK

Yine de bir şamandıra, bu yüzden 10.5 10.50'ye eşit
Savage

Biliyorum ki 10.5 == 10.50 ama müşteriye 10.5 değil 10.50'ye yazdırmam gerekiyor
MTK

2

lodash'dan tavan muhtemelen en iyisidir

_.ceil("315.9250488",2) 
_.ceil(315.9250488,2) 
_.ceil(undefined,2)
_.ceil(null,2)
_.ceil("",2)

bir numara ile de çalışacak ve güvenli


1
Lodash kullanıyorsanız geçerli yanıt, şu anda underscore.js kullanıyorum ve şu anda 1.9.1'de benzer bir işlevi yok.
Rodrirokr

1

@sd Kısa Yanıt: JS'de, ondalık işaretinden sonra sıfır içeren Number veri türü değerine sahip olmanın bir yolu yoktur.

Uzun Cevap: Dizeyi döndürmek için JavaScript'in özelliği toFixedveya toPrecisionişlevi. Bunun nedeni, Number veri tipinin a = 2.00 gibi bir değere sahip olamamasıdır, her zaman ondalıktan sonra sondaki sıfırları kaldırır. Bu, Number Datatype'in dahili özelliğidir. JS'de yukarıdakilere ulaşmak için 2 seçeneğimiz var

  1. Verileri dize olarak kullanın veya
  2. Sonunda 2.50 -> 2.5 olan '0' ile kesilmiş bir değer olduğunu kabul edin. Sayı Ondalıktan sonra sondaki sıfırlar olamaz

0

Yuvarlamak istemiyorsanız lütfen aşağıdaki işlevi kullanın.

function ConvertToDecimal(num) {
    num = num.toString(); //If it's not already a String
    num = num.slice(0, (num.indexOf(".")) + 3); //With 3 exposing the hundredths place
   alert('M : ' +  Number(num)); //If you need it back as a Number    
}

0

Değeri için: Ondalık bir sayı, ondalık bir sayıdır, ya başka bir değere yuvarlarsınız ya da yemezsiniz. Dahili olarak, kayan noktalı artthmetik ve işleme kuralına göre ondalık bir kesite yaklaşacaktır. Kaç basamak görüntülemek istediğinize bakılmaksızın dahili olarak ondalık sayı (kayan nokta, JS'de çift) kalır.

Görüntüleme için sunmak üzere, dize dönüşümü ile ekranın hassasiyetini istediğiniz gibi seçebilirsiniz. Sunum bir depolama sorunu değil, bir görüntüleme sorunudur.


0

Kayan değer 2 basamakları için .toFixed () öğesini kullanabilirsiniz.

Exampale

let newValue = parseFloat(9.990000).toFixed(2)

//output
9.99

-1

Bunu deneyin (koddaki yorumlara bakın):

function fixInteger(el) {
    // this is element's value selector, you should use your own
    value = $(el).val();
    if (value == '') {
        value = 0;
    }
    newValue = parseInt(value);
    // if new value is Nan (when input is a string with no integers in it)
    if (isNaN(newValue)) {
        value = 0;
        newValue = parseInt(value);
    }
    // apply new value to element
    $(el).val(newValue);
}

function fixPrice(el) {
    // this is element's value selector, you should use your own
    value = $(el).val();
    if (value == '') {
        value = 0;
    }
    newValue = parseFloat(value.replace(',', '.')).toFixed(2);
    // if new value is Nan (when input is a string with no integers in it)
    if (isNaN(newValue)) {
        value = 0;
        newValue = parseFloat(value).toFixed(2);
    }
    // apply new value to element
    $(el).val(newValue);
}

-1

Basit JavaScript, kayan dize:

var it_price = chief_double($("#ContentPlaceHolder1_txt_it_price").val());

function chief_double(num){
    var n = parseFloat(num);
    if (isNaN(n)) {
        return "0";
    }
    else {
        return parseFloat(num);
    }
}


-2
Solution for FormArray controllers 

FormArray form Oluşturucu'yu başlat

  formInitilize() {
    this.Form = this._formBuilder.group({
      formArray: this._formBuilder.array([this.createForm()])
    });
  }

Form Oluştur

  createForm() {
    return (this.Form = this._formBuilder.group({
      convertodecimal: ['']
    }));
  }

Form Değerlerini Form Denetleyicisine Ayarlama

  setFormvalues() {
    this.Form.setControl('formArray', this._formBuilder.array([]));
    const control = <FormArray>this.resourceBalanceForm.controls['formArray'];
    this.ListArrayValues.forEach((x) => {
      control.push(this.buildForm(x));
    });
  }

  private buildForm(x): FormGroup {
    const bindvalues= this._formBuilder.group({
      convertodecimal: x.ArrayCollection1? parseFloat(x.ArrayCollection1[0].name).toFixed(2) : '' // Option for array collection
// convertodecimal: x.number.toFixed(2)    --- option for two decimal value 
    });

    return bindvalues;
  }

-3

Başka çözümüm var.

Bunu round()yapmak için kullanabilirsiniztoFixed()

var twoPlacedFloat = parseFloat(yourString).round(2)

7
@AustinHenley round () kullanarak denedim ve işe yaramadı. Muhtemelen insanlar oy vermiyorlar. Math.round ()
Nathan

@Nathan, parseFloat()@zsalzbank
Alastair

3
Hayır, çalışmıyor. Math.round'u (parseFloat (yourString), 2) deneyebilirsiniz;
Augie Gardner

1
Asla işe yaramayacak bir cevabı neden küçümsemiyoruz? round()Js'deki sayılar gibi bir yöntem yoktur . Asıl soru bunu kimin onayladığını.
meandre
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.