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
Mary-Kate Olsenasal
2025-01-04 19:27:44441semak imbas

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);

menghasilkan output berikut:

6.900000
6.89999999999999946709
+ 0.00000000000000088818
= 6.90000000000000035527

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));

menghasilkan:

6.9
6.90000000000000000000
+ 0.00000000000000088818
= 6.90000000000000000000

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

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!

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