Rumah  >  Artikel  >  Java  >  Mengapakah Penukaran Terapung kepada Gandaan Kadang-kadang Nampak Kehilangan Ketepatan?

Mengapakah Penukaran Terapung kepada Gandaan Kadang-kadang Nampak Kehilangan Ketepatan?

Susan Sarandon
Susan Sarandonasal
2024-11-01 16:53:30825semak imbas

Why Does Converting a Float to a Double Sometimes Appear to Lose Precision?

Memelihara Ketepatan Semasa Menukar Terapung kepada Berganda

Masalah

Membuat apungan primitif kepada primitif berganda boleh menyebabkan kehilangan ketepatan yang ketara. Fenomena ini sering dikaitkan dengan ketepatan "tambahan" dua kali ganda, tetapi ia sebenarnya disebabkan oleh keupayaan terhad apungan untuk mewakili nombor tertentu dengan tepat.

Dalam contoh berikut, melontar apungan kepada dua kali menghasilkan pengenalan digit:

float temp = 14009.35F;
System.out.println(Float.toString(temp)); // 14009.35
System.out.println(Double.toString((double)temp)); // 14009.349609375

Penyelesaian Penghuraian

Satu penyelesaian ialah menukar apungan kepada rentetan dan kemudian menghuraikan rentetan sebagai dua kali ganda, yang mengekalkan nilai asal:

System.out.println(Double.toString(Double.parseDouble(Float.toString(temp)))); // 14009.35

Pertimbangan Ketepatan

Adalah penting untuk ambil perhatian bahawa digit "tambahan" sebenarnya tidak ditambah oleh primitif berganda. Terapung itu tidak mewakili nombor dengan tepat. Rangkap dua dengan tepat mewakili nilai apungan asal.

Penukaran kepada rentetan dan kembali menghasilkan nilai berganda yang lebih dekat dengan perwakilan rentetan, tetapi penting untuk mengesahkan bahawa ini sebenarnya wajar.

Alternatif BigDecimal

Dalam situasi di mana nilai perpuluhan yang tepat diperlukan (cth., pengiraan kewangan), pertimbangkan untuk menggunakan jenis BigDecimal dan bukannya apungan atau berganda, kerana ia memastikan perwakilan nombor perpuluhan yang lebih tepat.

Atas ialah kandungan terperinci Mengapakah Penukaran Terapung kepada Gandaan Kadang-kadang Nampak Kehilangan Ketepatan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn