2013-04-02 60 views
-2

我使用VC++ 2010編譯器。我下面的代碼給出了509:C++:奇怪的雙乘法錯誤

double volume = 5.1; 
int n = static_cast<unsigned int>(volume * 100.0); 

我想念什麼嗎?

感謝

+0

是你錯過了什麼... static_cast (..) – Mario

+0

這是soooooo在這裏重複。在[SO]上查找IEEE754和浮點問題。基本上,5.1不能完全表示,實際上它實際上被計爲'5.099999999 ' – ppeterka

+0

我認爲你的代碼不能編譯。我建議使用'round' –

回答

6

浮點數據類型不能代表所有的數字。由於您的計算機使用二進制浮點,只表示數字的形式爲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的文章。

0

5.1表示爲5.099999,與100.0相乘時爲509.9990,轉換爲int後爲509。