JavaScript mengkonversi INT besar ke notasi ilmiah ketika jumlahnya menjadi besar. Bagaimana saya bisa mencegah hal ini terjadi?
javascript
chris
sumber
sumber
translate
transformasi yang berisi koordinat dalam notasi ilmiah.Jawaban:
Ada Number.toFixed , tetapi menggunakan notasi ilmiah jika angkanya> = 1e21 dan memiliki ketepatan maksimum 20. Selain itu, Anda dapat memutar sendiri, tetapi akan berantakan.
Di atas menggunakan pengulangan string murah-'n'-mudah (
(new Array(n+1)).join(str)
). Anda bisa mendefinisikanString.prototype.repeat
menggunakan Perkalian Petani Rusia dan menggunakannya.Jawaban ini hanya boleh diterapkan pada konteks pertanyaan: menampilkan sejumlah besar tanpa menggunakan notasi ilmiah. Untuk hal lain, Anda harus menggunakan pustaka BigInt , seperti BigNumber , Leemon's BigInt , atau BigInteger . Ke depan, BigInt asli baru (catatan: bukan Leemon) harus tersedia; Chromium dan peramban yang didasarkan padanya ( Chrome , Edge [v79 +] baru, Brave ) dan Firefox semuanya memiliki dukungan; Dukungan Safari sedang berlangsung.
Begini cara Anda menggunakan BigInt untuk itu:
BigInt(n).toString()
Contoh:
Tampilkan cuplikan kode
Berhati-hatilah , meskipun bilangan bulat apa pun yang Anda hasilkan sebagai angka JavaScript (bukan BigInt) yang lebih dari 15-16 digit (khususnya, lebih besar dari
Number.MAX_SAFE_INTEGER + 1
[9.007.199.254.740.992]) dapat dibulatkan, karena jenis nomor JavaScript (presisi ganda JavaScript) floating point) tidak dapat secara tepat menampung semua bilangan bulat di luar titik itu. PadaNumber.MAX_SAFE_INTEGER + 1
saat ini berfungsi dalam kelipatan 2, sehingga tidak dapat menyimpan angka ganjil lagi (dan serupa, pada 18.014.398.509.481.984 itu mulai bekerja dalam kelipatan 4, kemudian 8, lalu 16, ...).Akibatnya, jika Anda dapat mengandalkan
BigInt
dukungan, output nomor Anda sebagai string yang Anda berikan keBigInt
fungsi:Contoh:
Tampilkan cuplikan kode
sumber
Math.abs
. Terimakasih atas peringatannya.toFixed(Number.MAX_VALUE) == Number.MAX_VALUE
harus kembali benar kalau begitu, tetapi tidak ...Saya tahu ini adalah pertanyaan yang lebih lama, tetapi baru-baru ini aktif. MDN toLocaleString
Anda dapat menggunakan opsi untuk memformat output.
catatan:
Number.toLocaleString () putaran setelah 16 tempat desimal, sehingga ...
... mengembalikan ...
586084736227728400000000000000000000000
Ini mungkin tidak diinginkan jika akurasi penting dalam hasil yang diinginkan.
sumber
js console.log( myNumb.toLocaleString('fullwide', { useGrouping: true, maximumSignificantDigits:6}) );
Untuk angka kecil, dan Anda tahu berapa desimal yang Anda inginkan, Anda dapat menggunakan toFixed dan kemudian menggunakan regexp untuk menghapus nol tambahan.
sumber
(1000).toFixed(0).replace(/\.?0+$/,"") // 1, not 1000
satu lagi solusi yang mungkin:
sumber
Number.MAX_SAFE_INTEGER
kemungkinan menderita masalah ini.Berikut ini adalah varian singkat
Number.prototype.toFixed
metode saya yang berfungsi dengan nomor apa pun:sumber
Number
. Jika Anda melemparkan yang pertama ke aNumber
, Anda akan melihat bahwa mereka benar - benar sama: jsfiddle.net/qd6hpnyx/1 . Anda dapat mengambil downvote Anda kembali:P
.0
dengan string kosong.console.log(2.2e307.toFixedSpecial(10))
. Maksud saya ... saya mendapatkan beberapa angka nol. Tetap upvoting karena ini tampaknya paling dekat dengan yang saya butuhkan.Solusi berikut melewati pemformatan eksponensial otomatis untuk angka yang sangat besar dan sangat kecil. Ini adalah solusi outis dengan perbaikan bug: Itu tidak berfungsi untuk angka negatif yang sangat kecil.
sumber
Jawaban orang lain tidak memberi Anda angka pastinya!
Fungsi ini menghitung angka yang diinginkan secara akurat dan mengembalikannya ke string untuk mencegahnya diubah oleh javascript!
Jika Anda membutuhkan hasil numerik, cukup gandakan hasil fungsi di nomor satu!
sumber
Gunakan
.toPrecision
,,.toFixed
dll. Anda dapat menghitung jumlah digit dalam nomor Anda dengan mengonversinya menjadi string dengan.toString
kemudian melihatnya.length
.sumber
(2e64).toString()
akan kembali"2e+64"
, jadi.length
tidak ada gunanya.Inilah yang akhirnya saya gunakan untuk mengambil nilai dari input, memperluas angka kurang dari 17 digit dan mengubah angka eksponensial menjadi x10 y
sumber
Anda dapat mengulangi angka dan mencapai pembulatan
sumber
Saya mencoba bekerja dengan bentuk string daripada angka dan ini sepertinya berhasil. Saya hanya menguji ini di Chrome tetapi harus universal:
sumber
Saya pikir mungkin ada beberapa jawaban yang sama, tetapi ada satu hal yang saya kemukakan
Catatan: ini hanya seakurat fungsi matematika javascript dan memiliki masalah saat menggunakan log, bukan log10 pada baris sebelum for for loop; ia akan menulis 1000 di base-10 sebagai 000 jadi saya mengubahnya ke log10 karena kebanyakan orang akan menggunakan base-10.
Ini mungkin bukan solusi yang sangat akurat tetapi saya bangga mengatakan itu dapat berhasil menerjemahkan angka di pangkalan dan dilengkapi dengan opsi untuk koma!
sumber
Pertanyaanmu:
Anda dapat menggunakan ini: https://github.com/MikeMcl/bignumber.js
seperti ini:
sumber
Saya tahu ini bertahun-tahun kemudian, tetapi saya telah mengerjakan masalah yang sama baru-baru ini dan saya ingin memposting solusi saya. Jawaban yang saat ini diterima melapisi bagian eksponen dengan 0, dan menambang mencoba untuk menemukan jawaban yang tepat, meskipun secara umum itu tidak sepenuhnya akurat untuk angka yang sangat besar karena batas JS dalam presisi titik mengambang.
Ini berhasil
Math.pow(2, 100)
, mengembalikan nilai yang benar dari 1267650600228229401496703205376.sumber
toFixed(Number.MAX_VALUE) == Number.MAX_VALUE
dengan beberapa masalah:
sumber
Menghilangkan ekspresi reguler. Ini tidak memiliki masalah presisi dan tidak banyak kode.
sumber
Jika Anda hanya melakukannya untuk tampilan, Anda bisa membuat array dari angka sebelum dibulatkan.
sumber
Saat ini tidak ada fungsi asli untuk membubarkan notasi ilmiah. Namun, untuk tujuan ini Anda harus menulis fungsionalitas Anda sendiri.
Ini milik saya:
sumber
Anda dapat menggunakan modul dari-eksponensial . Ini ringan dan sepenuhnya teruji.
sumber
Anda juga dapat menggunakan YourJS.fullNumber. Misalnya
YourJS.fullNumber(Number.MAX_VALUE)
hasil berikut ini:179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Ini juga berfungsi untuk jumlah yang sangat kecil.
YourJS.fullNumber(Number.MIN_VALUE)
mengembalikan ini:0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005
Penting untuk dicatat bahwa fungsi ini akan selalu mengembalikan angka hingga sebagai string tetapi akan mengembalikan angka yang tidak terbatas (mis.
NaN
AtauInfinity
) sebagaiundefined
.Anda dapat mengujinya di YourJS Console di sini .
sumber
Anda bisa menggunakan
number.toString(10.1)
:Catatan: Saat ini berfungsi di Chrome, tetapi tidak di Firefox. Spesifikasi mengatakan bahwa radix harus berupa bilangan bulat, sehingga ini menghasilkan perilaku yang tidak dapat diandalkan.
sumber
10.1
atau10
tidak sama dengan itu.Saya memiliki masalah yang sama dengan oracle yang mengembalikan notasi ilmiah, tetapi saya membutuhkan nomor aktual untuk url. Saya hanya menggunakan trik PHP dengan mengurangi nol, dan saya mendapatkan nomor yang benar.
misalnya 5.4987E7 adalah val.
newval sekarang sama dengan 54987000
sumber