2011-09-09 56 views
1

我們有一個學校的作業,我們被告知所有的數字在 的第三個十進制數字之後結束,這意味着在我們的例子中0.0009是0。 我如何在C++中做到這一點? 我應該使用運算符重載創建一個新類嗎? 謝謝只使用前3個十進制數字進行計算,如何? (C++)

+2

你的意思是計算或顯示? – birryree

+0

四捨五入麼?你爲什麼不把0.0009變成0.001? –

+0

想想你是否可以在輸入數字時操作數字。你當然不想重寫'float'類,因爲那樣你就不得不重新實現所有的數學運算符。 – Chris

回答

3

我應該使用運算符重載創建一個新的類嗎?

這將有助於使使用該類的代碼變得簡單。您要決定是否要努力獲得這種簡單性。

我該怎麼在C++中做到這一點?

在C++中,有一種方法可以將浮點數截斷爲小數點後的零位:一個強制轉換。

double d1 = 1.34; 
double d2 = (int)i; // now d2 is 1 

你可以用一些數學運算來截斷小數點後三位。

3

你應該能夠把你的號碼,乘以1000,執行你的算術運算,然後除以1000.0得到你的結果。

((int)(0.0009 * 1000))/1000.0 == 0.0 
+2

這很好,所有的,但通常避免只是給標籤[標籤:家庭作業]問題提供解決方案,而只是指導提問者尋求解決方案。 –

+0

雖然這有時會出錯,因爲例如'0.001 * 1000'可能略小於1。 –

1

您可以選擇使用整數。取0.0009 * 1000 = 0.9,只使用整數部分,iow 0.最後,您可以選擇將最終答案除以1000?

0

對於一些計算,不作類 - 它將使代碼更難理解(你做的任何時間運營商超載你必須考慮到未來的用戶由於意外行爲而犯錯誤)。話雖如此,你也許能夠擺脫一個非常簡單的類,它只包含一個「雙精度型」和「雙精度型」運算符以及一個構造函數。這是完全可以接受的。

#include <cmath> 
class Threep 
{ 
    double val; 
public: 
    Threep(double x) : val(floor(x*1000)/1000) {} 
    operator double() { return val; } 
    double operator=(double rhs) { val = floor(rhs*1000)/1000; return val;} 
    double operator*=(double rhs) { val = floor((val*rhs)*1000)/1000; return val;} 
    double operator/=(double rhs) { val = floor((val/rhs)*1000)/1000; return val;} 
    double operator+=(double rhs) { val = floor((val+rhs)*1000)/1000; return val;} 
    double operator-=(double rhs) { val = floor((val-rhs)*1000)/1000; return val;} 
}; 

我加了一些方便的分配與運營商一起= :-)

此代碼是未經測試,但它看起來不錯,我的眼睛。

相關問題