Bagaimana cara mem-parsing float dengan dua tempat desimal di javascript?


411

Saya memiliki kode berikut. Saya ingin memilikinya sehingga jika price_result sama dengan integer, katakanlah 10, maka saya ingin menambahkan dua tempat desimal. Jadi 10 akan menjadi 10.00. Atau jika sama dengan 10,6 akan menjadi 10,60. Tidak yakin bagaimana melakukan ini.

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

Jawaban:


916

Anda dapat menggunakan toFixed () untuk melakukan itu

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

1
senang membantu dan terus bekerja dengan baik pada - "belajar hal baru setiap hari"
Mahesh Velaga

3
toFixed cukup buggy. Juga, ini tautan yang lebih baik daripada w3schools developer.mozilla.org/en-US/docs/JavaScript/Reference/…
gotofritz

125
tetapi toFixed () mengembalikan angka sebagai string, jika Anda akan membandingkan angka, Anda perlu menggunakan parseFloat lagi.
Pedro Muniz

19
Gunakan var twoPlacedFloat = + parseFloat(yourString).toFixed(2)untuk mengonversi ke float
Jose Rui Santos

13
Tambahkan parens untuk mendapatkan nomor daripada string: parseFloat ((yourString) .toFixed (2));
pvanallen

50

Saat Anda menggunakannya toFixed, selalu mengembalikan nilai sebagai string. Ini terkadang menyulitkan kode. Untuk menghindari itu, Anda dapat membuat metode alternatif untuk Angka.

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

dan gunakan:

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

atau hanya:

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

Saya menulis program keranjang belanja dan mencoba menggunakan metode toFixed () dan round () yang dirantai ke metode parseFloat (). Tak satu pun dari metode ini bekerja dengan parseFloat ().
Chris22

Ini menyelamatkan saya dari beberapa sakit kepala. +1 hanya untuk itu. Saya tidak tahu itu akan mengubah angka menjadi string.
Lukas

@Lukas Tidak, jika parseFloat
Vlada

Ini mengembalikan 2 jika saya menerapkan ke nomor '2.00'
Saurin Dashadia

Metode ini untuk koreksi, bukan untuk pemformatan. Misalnya: 0.1 + 0.2 // 0.30000000000000004jadi saya perlu koreksi untuk itu(0.1+0.2).round() // 0.3
Vlada

47

Jika Anda membutuhkan kinerja (seperti dalam game):

Math.round(number * 100) / 100

Ini sekitar 100 kali lebih cepat dari parseFloat (number.toFixed (2))

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


5
Dengan rumus di atas '2.00' mengembalikan 2. tetapi saya ingin menjadi 2.00.
Saurin Dashadia

5
Anda tidak dapat memiliki keduanya. Jika Anda ingin output menjadi angka, bukan string, maka Anda tidak akan mendapatkan angka nol. Jadi Anda bisa menggunakan yang di atas dikonversi ke string: var twoPlacedFloat = (Math.round (2.002745 * 100) / 100) .toFixed (2);
pvanallen

3
Apakah kecepatan akan meningkat jika saya mengubah 100 ke 200?
alashow

Jika jumlah operasi floating point tetap sama kecepatannya akan sama, jadi tidak
Rob Boerman

mengapa tidak sederhana number * 1apakah saya melewatkan sesuatu mungkin 🤔?
ncubica

11

Untuk mengembalikan nomor, tambahkan lapisan tanda kurung lain. Tetap bersihkan.

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

2
Apakah Anda kehilangan sesuatu dalam formula Anda? var twoPlacedFloat = parseFloat(('2.00').toFixed(2))menghasilkan kesalahan.
Saurin Dashadia

maaf, ada variabel string bukan nomor, yang perlu toFixed () - diperbaiki sekarang. Tetapi jawaban Rob menggunakan Math.round adalah sesuatu yang harus dipertimbangkan dalam hal kinerja.
pvanallen

Ini harus menjadi komentar untuk jawaban Vlada.
Rodrirokr

5

Jika tujuan Anda adalah untuk menguraikan, dan masukan Anda mungkin literal, maka Anda akan mengharapkan floatdan toFixedtidak akan menyediakannya, jadi di sini ada dua fungsi sederhana untuk menyediakan ini:

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

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

2
Itu tidak berfungsi sebagaimana yang diharapkan. parseFloat(parseFloat('10.5').toFixed(2))kembali 10.5diperiksa 10.50. Juga parseFloat(parseFloat('10.50').toFixed(2))kembali10.5
MTK

Ini pelampung, jadi 10,5 sama dengan 10,50
Savage

Saya tahu bahwa 10,5 == 10,50 tetapi saya harus mencetak ke klien 10,50 bukan 10,5
MTK

2

langit-langit dari lodash mungkin yang terbaik

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

akan bekerja juga dengan angka dan aman


1
Jawaban yang layak jika menggunakan lodash, saya saat ini menggunakan underscore.js dan saat ini di 1.9.1 tidak memiliki fungsi yang sama.
Rodrirokr

1

@ sd Jawaban Singkat: Tidak ada cara di JS untuk memiliki nilai datatype angka dengan membuntuti nol setelah desimal.

Jawaban Panjang: Ini adalah properti dari toFixedatau toPrecisionfungsi JavaScript, untuk mengembalikan String. Alasan untuk ini adalah bahwa datatype Number tidak dapat memiliki nilai seperti a = 2.00, itu akan selalu menghapus nol setelah desimal, Ini adalah properti inbuilt dari Number Datatype. Jadi untuk mencapai hal di atas dalam JS kita punya 2 opsi

  1. Baik menggunakan data sebagai string atau
  2. Setuju untuk memiliki nilai terpotong dengan huruf '0' di akhir ex 2.50 -> 2.5. Angka Tidak dapat memiliki angka nol setelah desimal

0

Silakan gunakan fungsi di bawah ini jika Anda tidak ingin mengakhiri.

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

Untuk apa nilainya: Angka desimal, adalah angka desimal, Anda membulatkannya ke nilai lain atau tidak. Secara internal, itu akan mendekati fraksi desimal sesuai dengan aturan arthmetic dan handling floating point. Itu tetap angka desimal (floating point, dalam JS a double) secara internal, tidak peduli berapa banyak angka yang ingin Anda tampilkan.

Untuk menyajikannya untuk ditampilkan, Anda dapat memilih presisi tampilan untuk apa pun yang Anda inginkan dengan konversi string. Presentasi adalah masalah tampilan, bukan hal penyimpanan.


0

Anda dapat menggunakan .toFixed () untuk untuk float value 2 digit

Exampale

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

//output
9.99

-1

Coba ini (lihat komentar dalam kode):

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

JavaScript sederhana, string untuk melayang:

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 

Inisialisasi FormArray form Builder

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

Buat Formulir

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

Tetapkan Nilai Formulir ke Pengontrol Formulir

  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

Saya punya solusi lain.

Anda dapat menggunakannya round()untuk melakukan itutoFixed()

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

7
@AustinHenley Saya mencoba menggunakan round () dan tidak berhasil. Itu mungkin mengapa orang tidak memilih. Dia mungkin merujuk ke Math.round ()
Nathan

@Nathan harus digunakan sebaris, setelah parseFloat()saya memperbarui jawabannya oleh @zsalzbank
Alastair

3
Tidak, itu tidak berhasil. Anda dapat mencoba Math.round (parseFloat (yourString), 2);
Augie Gardner

1
Mengapa tidak memilih jawaban yang tidak akan pernah berhasil? Tidak ada metode seperti round()pada angka dalam js. Pertanyaan sebenarnya adalah siapa yang mengangkat ini.
Meandre
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.