2011-05-02 83 views
9

我一直在全面尋找適當的解釋,爲什麼會發生這種情況,但仍然沒有真正理解,所以我很抱歉,如果這是一個轉發。爲什麼這個double到int轉換不起作用?

#include <iostream> 
int main() 
{ 
    double x = 4.10; 
    double j = x * 100; 

    int k = (int) j; 

    std::cout << k; 
} 

Output: 409 

我似乎無法複製此行爲與任何其他數字。也就是說,用這種形式的任何其他數字代替4.10,並且輸出是正確的。

必須有某種我不理解的低級轉換的東西。

謝謝!

+0

[C++中奇怪的double到int轉換行爲] /stackoverflow.com/questions/1860783/strange-double-to-int-conversion-behavior-in-c) – 2011-05-02 01:49:38

+1

它只是讓我的頭旋轉試圖圍繞某人報告這樣的問題,而沒有提供他們什麼問題的信息是具有。 – 2011-05-02 02:03:14

回答

17

4.1不能由double精確表示,它得到的東西近似曾經如此略小:

double x = 4.10; 
printf("%.16f\n", x); // Displays 4.0999999999999996 

所以j將一些非常輕微小於410(即409.99 ...)。鑄造到int丟棄小數部分,讓你獲得409

(如果你想表現出類似的行爲另一個號碼,你可以嘗試8.2,或16.4,或32.8 ...看到這個模式?)

強制鏈接:What Every Computer Scientist Should Know About Floating-Point Arithmetic

+0

感謝您的解釋和良好的聯繫。 – Koma 2011-05-02 07:37:09

1

試試這個。

#include <iostream> 
#include "math.h" 
int main() 
{ 
double x = 4.10; 
double j = x * 100; 

int k = (int) j; 

std::cout << trunc(k); 
std::cout << round(k); 
} 
3

的修復

int k = (int)(j+(j<0?-0.5:0.5)); 

邏輯

您在使用數個鹼基的問題。

雖然屏幕上,4.10是一個小數,編譯後,它被表述爲二進制浮點數字,和0.10不準確轉換成二進制,並且你最終4.099999 ....

鑄造409.999 ...到int只是刪除數字。如果您在投射到int之前添加0.5,那麼它實際上會舍入到最接近的數字,或410(409.49將轉換爲409.99,轉換爲409)

+1

我自己使用了這個非常簡單的舍入公式,但它對於負數不太適用。 – 2011-05-02 03:34:57

+0

@Mark將修復編輯 – 2011-05-02 03:37:04

+0

謝謝!肯定會使用這個。 – Koma 2011-05-02 07:39:04