Saya ingin mencetak nilai ganda di Java tanpa bentuk eksponensial.
double dexp = 12345678;
System.out.println("dexp: "+dexp);
Ini menunjukkan notasi E ini: 1.2345678E7
.
Saya ingin mencetaknya seperti ini: 12345678
Apa cara terbaik untuk mencegah hal ini?
dexp: 12345681.000000
yang salah. Dan sebenarnya setelah itu saya ingin menampilkannya di halaman web saya di mana ia ditampilkan seperti ini.1.2345678E7
Apakah ada di mana saya dapat menyimpannya dalam bentuk double like12345678
dan cara lainnya?%.0f
.%.0f
membulatkan angka. Apakah ada cara untuk hanya membuang nol yang tertinggal?Java mencegah notasi E dalam dobel:
Lima cara berbeda untuk mengubah angka ganda menjadi angka normal:
Program ini mencetak:
Yang semuanya nilainya sama.
Protip: Jika Anda bingung mengapa angka-angka acak itu muncul di luar batas tertentu dalam nilai ganda, video ini menjelaskan: computerphile mengapa
0.1
+0.2
sama0.30000000000001
?http://youtube.com/watch?v=PZRI1IfStY0
sumber
Pendeknya:
Jika Anda ingin menghilangkan angka nol dan masalah Lokal, maka Anda harus menggunakan:
Penjelasan:
Mengapa jawaban lain tidak cocok untuk saya:
Double.toString()
atauSystem.out.println
atauFloatingDecimal.toJavaFormatString
menggunakan notasi ilmiah jika dobel kurang dari 10 ^ -3 atau lebih besar dari atau sama dengan 10 ^ 7Dengan menggunakan
%f
, presisi desimal default adalah 6, jika tidak, Anda dapat meng-hardcode-nya, tetapi hasilnya nol tambahan yang ditambahkan jika Anda memiliki lebih sedikit desimal. Contoh:Dengan menggunakan
setMaximumFractionDigits(0);
atau%.0f
Anda menghapus presisi desimal, yang baik untuk bilangan bulat / panjang, tetapi tidak untuk ganda:Dengan menggunakan DecimalFormat, Anda bergantung pada lokal. Di lokal Prancis, pemisah desimal adalah koma, bukan titik:
Menggunakan lokal BAHASA INDONESIA memastikan Anda mendapatkan titik untuk pemisah desimal, di mana pun program Anda akan berjalan.
Mengapa menggunakan 340 lalu untuk
setMaximumFractionDigits
?Dua alasan:
setMaximumFractionDigits
menerima bilangan bulat, tetapi implementasinya memiliki angka maksimum yang diizinkanDecimalFormat.DOUBLE_FRACTION_DIGITS
yang sama dengan 340Double.MIN_VALUE = 4.9E-324
jadi dengan 340 digit Anda yakin untuk tidak membulatkan ganda dan kehilangan presisi.sumber
new BigDecimal(myvalue).toPlainString()
Dari uraian di docs.oracle.com/javase/7/docs/api/java/math/… ), tidak segera jelas bagaimana perilakunya ketika diberikan berbagai jenis angka, tetapi tidak menghilangkan notasi ilmiah .new BigDecimal(0.00000021d).toPlainString()
output0.0000002100000000000000010850153241148685623329583904705941677093505859375
yang tidak seperti yang Anda harapkan ...BigDecimal.valueOf(0.00000021d).toPlainString()
berfungsi juga (menggunakan konstruktor String BigDecimal itu sebabnya)Anda bisa mencobanya dengan
DecimalFormat
. Dengan kelas ini Anda sangat fleksibel dalam mem-parsing nomor Anda.Anda dapat dengan tepat mengatur pola yang ingin Anda gunakan.
Dalam kasus Anda misalnya:
sumber
Saya punya solusi lain yang melibatkan BigDecimal toPlainString (), tetapi kali ini menggunakan String-constructor, yang direkomendasikan di javadoc:
Sepertinya ini dalam bentuk terpendek:
Sebelum Java 8, ini menghasilkan "0,0" untuk Doubles bernilai nol, jadi Anda perlu menambahkan:
Nilai NaN dan tak terbatas harus diperiksa ekstra.
Hasil akhir dari semua pertimbangan ini:
Ini juga dapat disalin / ditempelkan agar berfungsi dengan baik dengan Float.
sumber
d.doubleValue() == 0
bukannyad == 0
?Ini akan berfungsi selama nomor Anda adalah angka utuh:
Jika variabel ganda memiliki presisi setelah titik desimal, ia akan memotongnya.
sumber
Saya perlu mengonversi beberapa nilai ganda menjadi mata uang dan menemukan bahwa sebagian besar solusi tidak masalah, tetapi tidak untuk saya.
Ini
DecimalFormat
akhirnya menjadi jalan saya, jadi inilah yang telah saya lakukan:Seperti yang Anda lihat, jika angka itu alami saya dapatkan - katakan - 20000000 bukannya 2E7 (dll.) - tanpa titik desimal.
Dan jika itu desimal, saya hanya mendapatkan dua digit desimal.
sumber
Kompiler Java / Kotlin mengkonversi nilai apa pun yang lebih besar dari 9999999 (lebih besar dari atau sama dengan 10 juta) menjadi notasi ilmiah yaitu. Notasi Epsilion .
Mis: 12345678 dikonversi menjadi 1.2345678E7
Gunakan kode ini untuk menghindari konversi otomatis ke notasi ilmiah:
sumber
Kode berikut mendeteksi jika nomor yang disediakan disajikan dalam notasi ilmiah. Jika demikian, itu direpresentasikan dalam presentasi normal dengan maksimum '25' digit.
sumber
Saya pikir semua orang punya ide yang tepat, tetapi semua jawaban tidak langsung. Saya bisa melihat ini menjadi bagian kode yang sangat berguna. Berikut ini cuplikan dari apa yang akan berfungsi:
yang
".8"
adalah tempat Anda mengatur jumlah tempat desimal Anda ingin menunjukkan.Saya menggunakan Eclipse dan tidak ada masalah.
Semoga ini bermanfaat. Saya sangat menghargai umpan balik!
sumber
Saya memiliki masalah yang sama dalam kode produksi saya ketika saya menggunakannya sebagai input string ke fungsi math.Eval () yang mengambil string seperti "x + 20/50"
Saya melihat ratusan artikel ... Pada akhirnya saya pergi dengan ini karena kecepatan. Dan karena fungsi Eval akan mengubahnya kembali ke dalam format angka sendiri dan akhirnya matematika. .
Ini sekarang digunakan dalam kode produksi untuk aplikasi yang memiliki 1.000 pengguna ...
sumber
Ini mungkin tangen .... tetapi jika Anda harus meletakkan nilai numerik sebagai integer (yang terlalu besar untuk menjadi integer) ke dalam serializer (JSON, dll.) Maka Anda mungkin ingin "BigInterger"
Contoh: nilai adalah string - 7515904334
Kita perlu menggambarkannya sebagai angka dalam pesan Json: {"contact_phone": "800220-3333", "servicer_id": 7515904334, "servicer_name": "SOME CORPORATION"}
Kami tidak dapat mencetaknya atau kami akan mendapatkan ini: {"contact_phone": "800220-3333", "servicer_id": "7515904334", "servicer_name": "SOME CORPORATION"}
Menambahkan nilai ke simpul seperti ini menghasilkan hasil yang diinginkan: BigInteger.valueOf (Long.parseLong (value, 10))
Saya tidak yakin ini benar-benar sesuai topik, tetapi karena pertanyaan ini adalah hit teratas saya ketika saya mencari solusi, saya pikir saya akan berbagi di sini untuk kepentingan orang lain, bohong, yang pencariannya buruk. : D
sumber
Untuk nilai integer yang diwakili oleh a
double
, Anda dapat menggunakan kode ini, yang jauh lebih cepat daripada solusi lain.sumber
Solusi saya: String str = String.format ("% .0f", yourDouble);
sumber