Rumah > pembangunan bahagian belakang > C++ > Mengapa C# dan C Menghasilkan Output Berbeza Apabila Pemformatan Berganda?

Mengapa C# dan C Menghasilkan Output Berbeza Apabila Pemformatan Berganda?

Mary-Kate Olsen
Lepaskan: 2025-01-04 19:27:44
asal
446 orang telah melayarinya

Why Do C# and C Produce Different Output When Formatting Doubles?

Memformat Beregu untuk Output dalam C#

Dalam percubaan baru-baru ini, percubaan telah dibuat untuk meniru keupayaan pemformatan output C dalam C#. Walau bagaimanapun, percanggahan diperhatikan antara output yang dijangka dan sebenar.

Kod C:

double i = 10 * 0.69;
printf("%f\n", i);
printf("  %.20f\n", i);
printf("+ %.20f\n", 6.9 - i);
printf("= %.20f\n", 6.9);
Salin selepas log masuk

menghasilkan output berikut:

6.900000
6.89999999999999946709
+ 0.00000000000000088818
= 6.90000000000000035527
Salin selepas log masuk

Kod C#:

double i = 10 * 0.69;
Console.WriteLine(i);
Console.WriteLine(String.Format("  {0:F20}", i));
Console.WriteLine(String.Format("+ {0:F20}", 6.9 - i));
Console.WriteLine(String.Format("= {0:F20}", 6.9));
Salin selepas log masuk

menghasilkan:

6.9
6.90000000000000000000
+ 0.00000000000000088818
= 6.90000000000000000000
Salin selepas log masuk

Walaupun saya muncul sebagai 6.89999999999999946709 dalam penyahpepijat, pemformatan C# membundarkan nilai kepada 15 digit perpuluhan bererti sebelum menggunakan format.

Tingkah laku yang tidak dijangka ini adalah kerana .NET secara dalaman menyimpan dua kali menggunakan perwakilan binari. Sebelum memformat, .NET menukarkan dua kali ganda kepada rentetan perpuluhan, yang secara semula jadi memperkenalkan ralat pembundaran.

Untuk mengelakkan isu ini, seseorang boleh sama ada:

  • Akses perpuluhan tepat nilai ganda: Bina perwakilan rentetan bagi nilai perpuluhan dengan mengekstrak bit binari dalaman secara manual.
  • Gunakan pustaka pemformatan tersuai: Manfaatkan kelas DoubleConverter Jon Skeet, yang menyediakan kaedah untuk mendapatkan semula nilai perpuluhan tepat bagi dua kali ganda dan membulatkan output kepada ketepatan yang ditentukan.

Contoh penggunaan DoubleConverter:

Console.WriteLine(DoubleConverter.ToExactString(i));
Console.WriteLine(DoubleConverter.ToExactString(6.9 - i));
Console.WriteLine(DoubleConverter.ToExactString(6.9));

// 6.89999999999999946709294817992486059665679931640625
// 0.00000000000000088817841970012523233890533447265625
// 6.9000000000000003552713678800500929355621337890625
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapa C# dan C Menghasilkan Output Berbeza Apabila Pemformatan Berganda?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan