我使用VC++ 2010編譯器。我下面的代碼給出了509:C++:奇怪的雙乘法錯誤
double volume = 5.1;
int n = static_cast<unsigned int>(volume * 100.0);
我想念什麼嗎?
感謝
我使用VC++ 2010編譯器。我下面的代碼給出了509:C++:奇怪的雙乘法錯誤
double volume = 5.1;
int n = static_cast<unsigned int>(volume * 100.0);
我想念什麼嗎?
感謝
浮點數據類型不能代表所有的數字。由於您的計算機使用二進制浮點,只表示數字的形式爲S2 Ë其中小號是有效數,並ē是指數。很容易看到5.1不適合該模具。它不完全可以代表。
這個page顯示你最接近的精確表示的雙精度二進制浮點值到5.1。值爲:
5.09999 99999 99999 64472 86321 19949 90706 44378 66210 9375
因此,與5.1的最接近值略小於5.1。將其乘以100並截斷,並且您有509.
David Goldberg的What Every Computer Scientist Should Know About Floating-Point Arithmetic的標準參考文獻是David Goldberg的文章。
5.1表示爲5.099999,與100.0相乘時爲509.9990,轉換爲int後爲509。
是你錯過了什麼... static_cast(..) –
Mario
這是soooooo在這裏重複。在[SO]上查找IEEE754和浮點問題。基本上,5.1不能完全表示,實際上它實際上被計爲'5.099999999' –
ppeterka
我認爲你的代碼不能編譯。我建議使用'round' –