2017-02-22 105 views
1
int a,b; 
a = 2147483647; 
b = 1000; 
printf("%.2f",(float)a/(float)b); 

四捨五入這應該打印2147483.65而是它打印出2147483.75請幫助漂浮在C++

+4

浮點數只有32位,與你的'int'相同,但它必須支持浮點值,按照定義。要做的那些必須來自某個地方。它們不能存在於超空間中,並且在現實世界中沒有空間,這些32位中的一些必須被保留用於這種目的。因此,一個浮點數沒有足夠的位來表示2147483647. –

+0

@SamVarshavchik的意思是,**與你的編譯器**很明顯...... –

+0

'float'沒有那麼高的精度 –

回答

3

演員A和B double,而不是float

原因

在程序中的一個值是2147483647,其是可以由一個4字節長(32位)的數據類型,諸如int被存儲的最高值。但是,即使是32位數據類型,它也會截斷它,因爲它也必須考慮小數位數。如果使用double,則它的長度爲8個字節,因此可以輕鬆容納2147483647或2147483.65。

-2

double

#include <iostream> 
using namespace std; 

int main() { 
    // your code goes here 
    long a,b; 
    a = 2147483647; 
    b = 1000; 
    printf("%.2f",(double)a/(double)b); // No need to cast both a/(double)b is enough 
    return 0; 
} 

O/P替換float:2147483.65 Check here

這是因爲浮點數據類型的具有處理小數部分,以及。

0

這裏的問題是,您的內存空間不足以存儲浮點值。我將通過對問題進行更廣泛的觀點來解釋這個問題。

2147483647是可存儲在32位帶符號int變量中的最大數字。如果我們看到它是二進制格式,它是:1111111111111111111111111111111.現在,即使有符號浮點數也是4個字節(32位有符號),浮點變量也必須存儲小於1且大於0的值。因此,你在下面的行面臨一個問題:

printf("%.2f",(float)a/(float)b); 

因爲當你施放一個浮動,在你不經意間做(float)(2147483647)。現在,因爲這個數字需要31位(第32位是數值的符號;這裏是零,因爲數字是正數),並且一個浮點爲該數值的小數部分分配了一些空間, 31位爲相同的值。這會導致浮點溢出,並導致您遇到的問題。

所以,要解決這個問題,你應該把a加倍。將b作爲一個雙精度浮點數是不合適的,因爲它適合於浮點數。此外,在數學運算中投射一個變量足以讓編譯器將結果視爲轉換爲其中一個變量的類型。

所以,簡單地做:

printf("%.2f",(double)a/b); 

你施放最終結果以一種,和它給你所期望的結果2147483.65。順便說一下,一個double有8個字節的內存,是float的兩倍大小。因此,在需要精度的操作中使用雙精度更加實用。