Saya memiliki pelampung primitif dan saya perlu sebagai primitif ganda. Cukup melemparkan pelampung menjadi dua kali lipat memberi saya presisi ekstra yang aneh. Sebagai contoh:
float temp = 14009.35F;
System.out.println(Float.toString(temp)); // Prints 14009.35
System.out.println(Double.toString((double)temp)); // Prints 14009.349609375
Namun, jika alih-alih melakukan casting, saya mengeluarkan float sebagai string, dan mengurai string sebagai double, saya mendapatkan apa yang saya inginkan:
System.out.println(Double.toString(Double.parseDouble(Float.toString(temp))));
// Prints 14009.35
Apakah ada cara yang lebih baik daripada pergi ke String dan kembali?
sumber
Saya menemukan solusi berikut:
Jika Anda menggunakan float dan double, bukan Float dan Double, gunakan yang berikut:
sumber
Gunakan sebagai
BigDecimal
penggantifloat
/double
. Ada banyak angka yang tidak bisa direpresentasikan sebagai floating point biner (misalnya,0.1
). Jadi, Anda harus selalu membulatkan hasil ke presisi atau penggunaan yang diketahuiBigDecimal
.Lihat http://en.wikipedia.org/wiki/Floating_point untuk informasi lebih lanjut.
sumber
BigDecimal
karena itu akan menangkap sebagian besar kesalahan umum. Jika segala sesuatunya berjalan terlalu lambat, mereka perlu belajar lebih banyak dan menemukan cara untuk mengoptimalkan masalah mereka. Optimasi prematur adalah akar dari segala kejahatan - DE Knuth.Float, pada dasarnya, tidak tepat dan selalu memiliki "masalah" pembulatan yang rapi. Jika presisi penting, Anda dapat mempertimbangkan untuk memfaktorkan ulang aplikasi Anda untuk menggunakan Desimal atau BigDecimal.
Ya, float secara komputasi lebih cepat daripada desimal karena dukungan prosesor on. Namun, apakah Anda ingin cepat atau akurat?
sumber
Untuk informasi, ini ada di Item 48 - Hindari float dan double ketika nilai yang tepat diperlukan, dari Effective Java 2nd edition oleh Joshua Bloch. Buku ini dikemas dengan barang-barang bagus dan pasti menarik untuk dilihat.
sumber
Apakah ini berhasil?
sumber
Solusi sederhana yang berfungsi dengan baik, adalah mengurai ganda dari representasi string float:
Tidak super efisien, tapi berhasil!
sumber