2013-02-04 38 views
-1

我有一個浮點數,但我只想要數到2點的精度。我如何在C++中獲得這個?捨棄4個精確點?

float foo(float num) { // num=1234.567891 
    // code 
    return num2;   // returns 1234.560000 
} 
+0

不是一個C++的傢伙,但你可以乘以100乘以100作爲一個整數,然後投入爲一個浮動和除以100? –

+0

這是一個選項嗎? 'int(num * 100)/(float)100' –

+3

請問有什麼用途?如果您只想在小數點後打印兩個地方,只需查看輸出格式。 – StoryTeller

回答

1

一個簡單的方法是:

float foo(float num) { 
    return floor(num * 100)/100; 
} 

您也可以考慮:

float foo(float num) { 
    return (int)(num * 100)/100.0f; 
} 

有可能是負數的差異。我只能從你的問題得到的信息是,對於你想要的floor(而不是round例如)的正數。

+0

像(int)(表達式)或類似static_int(表達式)類型轉換嗎? 還是他們一樣? – ofey

+0

'(int)(expression)'是C風格。 'static_cast (表達式)'是C++風格。無論你選擇哪個應該是相同的(注:我喜歡C)。如果你有'dynamic_cast <>'和類似的結構,我建議第二種形式,因爲它給你的代碼更規律。 – Shahbaz

0

您可以通過乘法和舍入/截斷來嘗試將浮點數四捨五入到一定的小數位數。

因此num = floor(num * 100.f)/100.f;會嘗試截斷到小數點後兩位。

但是請注意,這與修正浮標的精度不一樣。根據定義,浮點數中的小數點浮點數爲。而且你只有大約7位數的精度。

因此,您的原始數字不能像「1234.567891」那樣精確 - 這對於浮動來說過於精確。

也許更重要的是,你從這樣一個函數的輸出可能也不準確。 「1234.56」不能用浮點數表示,所以返回的值不會是「1234.560000」。

數字的整數部分越大,小數點後面的數字越少。事實上,即使是中等數量的人數也不能代表任何小數部分。

0

浮點類型有它們自己的內部精度。你不能改變它。你可以通過各種方式來操作這個值,但最終浮點類型管理它們自己的精度,並且你不會限制它們的操作。即使你設法迫使一堆零進入某個值的低位,後續的計算仍然會使用完整的精度,並且你只在計算中引入一些隨機噪聲。

什麼你可以做的是控制在輸入輸出的顯著位數。這幾乎總是管理精確度的正確方法。