Rumah >pembangunan bahagian belakang >C++ >Mengapa C# dan C Menghasilkan Output Berbeza Apabila Pemformatan Berganda?
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:
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!