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));
pengguna357034
sumber

Jawaban:

916

Anda dapat menggunakan toFixed () untuk melakukan itu

var twoPlacedFloat = parseFloat(yourString).toFixed(2)
Mahesh Velaga
sumber
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
Vlada
sumber
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

Rob Boerman
sumber
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));
pvanallen
sumber
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));
}
Kejam
sumber
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

Antonio Terreno
sumber
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
abhinav pandey
sumber
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    
}
Nimesh
sumber
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.

andora
sumber
0

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

Exampale

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

//output
9.99
Rizo
sumber
-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);
}
Mitre Slavchev
sumber
-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);
    }
}
Arun Prasad ES
sumber
-2

Solusi yang bekerja untuk saya adalah sebagai berikut

parseFloat(value)
Jorge Santos Neill
sumber
-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;
  }
Thulasiram Virupakshi
sumber
-3

Saya punya solusi lain.

Anda dapat menggunakannya round()untuk melakukan itutoFixed()

var twoPlacedFloat = parseFloat(yourString).round(2)
equipo_INSA-Inditex_OU
sumber
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