Saya memiliki nomor float seperti 3.2
dan 1.6
.
Saya perlu memisahkan angka menjadi bilangan bulat dan desimal. Misalnya, nilai 3.2
akan dibagi menjadi dua angka, yaitu 3
dan0.2
Mendapatkan bagian integer itu mudah:
n = Math.floor(n);
Tetapi saya kesulitan mendapatkan bagian desimal. Saya sudah mencoba ini:
remainer = n % 2; //obtem a parte decimal do rating
Tapi itu tidak selalu berhasil dengan benar.
Kode sebelumnya memiliki output sebagai berikut:
n = 3.1 => remainer = 1.1
Apa yang saya lewatkan di sini?
n = Math.floor(n);
hanya mengembalikan hasil yang Anda inginkan (bagian bilangan bulat) untuk nomor non-negatif% 1
tidak% 2
Jawaban:
Gunakan
1
, bukan2
.sumber
Math.*
atau%
operasi.toFixed
bisa membantu dalam beberapa situasi misalnya(2.3 % 1).toFixed(4)
=="0.3000"
.(2.3 % 1).toFixed(4).substring(2)
="3000"
jika Anda membutuhkannya tanpa0.
2.3
telah muncul, dan bukan2
atau3
, angkanya0.2999999999999998
dapat diterima dengan sempurna meskipun tampak menghina di mata manusia.Meskipun ini tidak akan bekerja untuk angka minus, jadi kita mungkin harus melakukannya
sumber
Math.floor()
lagi - cukup gunakan bagian integer yang telah Anda hitung.var n = 3.2, integr = Math.floor(n), decimal = n - integr;
gunakan Math.floor () sekali saja.integr = 3; decimal = 0.20000000000000018;
Math.floor
denganMath.trunc
.Anda dapat mengonversi menjadi string, bukan?
sumber
n.toString()
daripadan + ""
karena itu lebih mudah dibaca.n + ""
memang lebih baik (lihat jsperf.com/number-vs-number-tostring-vs-string-number ).
sebagai pemisah desimal sehingga Anda baik-baik saja di mana-mana jika tipe variabel input Anda mengambang. Anda hanya harus berurusan dengan masalah itu jika input Anda adalah string. Saya juga harus mencatat bahwa jawaban ini mengembalikan string dalam array. Solusi yang lebih lengkap adalahparseFloat('0.' + (n + '').split('.')[1])
Bagaimana 0,2999999999999998 jawaban yang dapat diterima? Jika saya penanya, saya ingin jawaban 0,3. Apa yang kami miliki di sini adalah presisi salah, dan percobaan saya dengan lantai,%, dll menunjukkan bahwa Javascript menyukai presisi palsu untuk operasi ini. Jadi saya pikir jawaban yang menggunakan konversi ke string ada di jalur yang benar.
Saya akan melakukan ini:
Secara khusus, saya menggunakan 100233.1 dan saya menginginkan jawaban ".1".
sumber
.toString()
tidak mempertimbangkan i18n. Pemisah desimal akan selalu.
sesuai dengan MDN dan spesifikasi ECMAInilah cara saya melakukannya, yang menurut saya merupakan cara paling mudah untuk melakukannya:
sumber
Cara sederhana untuk melakukannya adalah:
Sayangnya, itu tidak mengembalikan nilai yang tepat. Namun, itu mudah diperbaiki:
Anda dapat menggunakan ini jika Anda tidak tahu jumlah tempat desimal:
sumber
Cara mandiri bahasa:
perhatikan bahwa itu hanya mengoreksi angka dengan satu panjang fractioanal)
sumber
var factor = Math.pow(10, desiredFractionLength); var fract = a * factor % factor / factor;
Anda dapat menggunakan
parseInt()
fungsi untuk mendapatkan bagian integer daripada menggunakannya untuk mengekstrak bagian desimalAtau Anda bisa menggunakan regex seperti:
sumber
0.20000000000000018
... ini benar-benar semakin sulit dilakukan karena0.2 < 0.20000000000000018
mengembalikan true .. 3,2 seharusnya mengembalikan 0,2: P membuat begitu banyak penyimpangan dan menggunakan.toFixed(2)
string pengembalian: PBerikut ini berfungsi terlepas dari pengaturan regional untuk pemisah desimal ... dengan syarat hanya satu karakter yang digunakan untuk pemisah.
Tidak cantik, tapi akurat.
sumber
Jika ketepatan penting dan Anda membutuhkan hasil yang konsisten, berikut adalah beberapa proposisi yang akan mengembalikan bagian desimal dari angka apa pun sebagai string, termasuk yang memimpin "0.". Jika Anda membutuhkannya sebagai pelampung, cukup tambahkan
var f = parseFloat( result )
pada akhirnya.Jika bagian desimal sama dengan nol, "0,0" akan dikembalikan. Null, NaN, dan angka yang tidak ditentukan tidak diuji.
1. String.split
2. String.substring, String.indexOf
3. Math.floor, Number.toFixed, String.indexOf
4. Math.floor, Number.toFixed, String.split
Berikut ini tautan jsPerf: https://jsperf.com/decpart-of-number/
Kita dapat melihat bahwa proposisi # 2 adalah yang tercepat.
sumber
Anda bisa mengonversinya menjadi string dan menggunakan
replace
metode ini untuk mengganti bagian integer dengan nol, lalu mengonversi hasilnya kembali ke angka:sumber
/^[^,]/
), tetapi Anda kemudian harus meninggalkan hasilnya sebagai string (menghapus+
operator) untuk menghindariNaN
hasil.Tergantung penggunaan yang akan Anda berikan setelahnya, tetapi solusi sederhana ini juga bisa membantu Anda.
Saya tidak mengatakan itu solusi yang baik, tetapi untuk beberapa kasus nyata berhasil
Tapi itu akan memakan waktu lebih lama dari solusi yang diusulkan oleh @Brian M. Hunt
sumber
Saya memiliki kasus di mana saya tahu semua angka yang dimaksud hanya akan memiliki satu desimal dan ingin mendapatkan bagian desimal sebagai bilangan bulat sehingga saya akhirnya menggunakan pendekatan semacam ini:
Ini berfungsi dengan baik juga dengan integer, menghasilkan 0 dalam kasus tersebut.
sumber
Saya menggunakan:
Input: -556.123444444
Hasil: 123444444
sumber
Fungsi matematika lebih cepat, tetapi selalu mengembalikan nilai yang tidak diharapkan asli. Cara termudah yang saya temukan adalah
sumber
Pilihan yang baik adalah mengubah angka menjadi string dan kemudian membaginya.
Dalam satu baris kode
sumber
Setelah melihat beberapa dari ini, saya sekarang menggunakan ...
sumber
sumber
Meskipun saya sangat terlambat untuk menjawab ini, silakan lihat kodenya.
sumber
Format tanda dan angka desimal titik mengambang dapat bergantung dari negara (
.,
), sehingga solusi independen, yang mempertahankan bagian titik mengambang, adalah:- ini adalah solusi internasional, alih-alih bergantung pada lokasi:
Penjelasan solusi langkah demi langkah:
parseFloat()
untuk menjamin input inputMath.abs()
untuk menghindari masalah dengan angka negatifn = parseInt(x)
untuk mendapatkan bagian desimalx - n
untuk mengurangi bagian desimaltoFixed()
dengan jumlah digit di bagian mengambang dari nomor float aslix
. Hitungan dihitung sebagai perbedaan antara panjang angka aslix
dan angkan
dalam representasi string mereka.sumber
Gunakan yang ini:
The
Math.frac
Fungsi sini memiliki 3 mode:Itu mudah :)
sumber
sumber