Pertanyaan mengapa 1,2 * 30 = 35?


Mengapa ini:

int main(void)
{
    short w = 30;
    return  1.2 * w;
}

kembali 35?


3
2017-09-28 09:25


asal


Jawaban:


Jika Anda ingin mendapatkan hasil yang lebih sesuai, coba yang berikut ini:

return 12*w/10

14
2017-09-28 09:36



1.2 * w aku s 36.0. Ini memiliki arti tipe ganda itu tidak diwakili secara pasti.

Kemungkinan itu ternyata sedikit kurang dari 36, mungkin 35.99999 jadi ketika Anda mengembalikannya bagian pecahan dibuang dan bagian bilangan bulat hanya dikembalikan. Begitulah cara Anda mendapatkannya 35.


P.S. Semua operasi dengan floating point tidak tepat. Anda harus mengharapkan sedikit perbedaan. Juga ketika Anda membandingkan nilai floating point dengan nilai tetap, Anda tidak harus melakukan perbandingan langsung tetapi melakukan perbandingan rentang.

Salah: if (value == 36.0) { /* ... */ }

Benar: if (abs (value - 36.0) < 0.0001) { /* ... */ }


12
2017-09-28 09:28



Ini masalah dengan presisi titik mengambang biner. 1.2 sangat sedikit kurang dari 1,2, jadi hasil perkalian sedikit kurang dari 36.


3
2017-09-28 09:29



Karena representasi: 1,2 benar-benar seperti 1,1999999


3
2017-09-28 09:29



Karena matematika floating point bisa tidak tepat, gunakan round() sebelum melakukan casting ke integer, untuk mendapatkan hasil yang lebih baik.

#include <math.h>
...
return (int)round(some_real_value);

3
2017-09-28 16:35



Jangan berharap hasil yang benar-benar tepat dalam operasi floating point. Hasil perkalian mungkin, misalnya, 35,9999, yang dibulatkan menjadi 35.


1
2017-09-28 09:29



pendek w = 30;  kembali 1,2 * w;

Dalam pernyataan return, nilai sortir pertama adalah tipe cast dalam double karena 1.2 adalah tipe double jadi itu akan bertambah banyak 1.2 * 30.000000 dan hasilnya menjadi sekitar 35,999999 dan fungsi kembali adalah tipe int sehingga bagian desimal terpotong dan hanya mengembalikan 35.


0
2017-09-28 09:53