2011-12-11 82 views
1

如何在大型C++程序中爲所有double型精度使用精度設置精度。如何在大型C++程序中爲所有雙精度型數字設置小數精度

我可以使用stringstreamsetprecision(n)來做到這一點,但我必須在整個程序中每double一個一個地做。

如何在全局範圍內進行一次全部操作,以便程序中的所有double型號在小數點後都有固定的十進制數字(例如4)?

我不想使用函數調用導致調用開銷。

感謝

+0

正如我以前回答,你不能改變雙精度:它是它是什麼。所以恐怕我不明白這個問題。你想截斷一個double值到第四個小數位嗎?或者你是否想要定義一個類似雙精度型但有4個固定小數位的類型? – rodrigo

+0

我想要以後。所以,我使用了stringstream和setprecision和<<運算符。我知道如何去做。但是,我不明白爲什麼你的功能比我所做的更有效率? – user1002288

+0

這不是更有效率,請參閱我的新答案。 – rodrigo

回答

0

setprecision不會改變雙值的精度,但只是當轉換成字符串使用的精度。

將雙打轉換爲字符串是相對昂貴的操作,因此單個額外函數調用的開銷應該可以忽略不計。如果你在性能關鍵代碼中使用雙字符串轉換,那麼你做錯了。

我的建議是隻寫一個函數,例如:

std::string FmtDbl(double d) 
{ 
    std::ostringstream os; 
    os << std::setprecision(4) << d; 
    return os.str(); 
} 

,並使用該功能無處不在您需要的轉換。

+0

謝謝,但你的函數也需要做雙重字符串轉換,然後我需要將字符串轉換爲函數返回值的兩倍。它也有通話費用。爲什麼你的功能更有效率?謝謝 – user1002288

2

double類型不是爲了做你想做的事情而設計的:它是一個浮點十進制類型,不是一個固定的十進制類型。你需要的是某種十進制類型,但不幸的是C++還沒有這種類型。

它可以用整數類型模擬大多數時間,假設它代表單位的千分位數。你必須小心乘法和除法來解決這個問題。加法和減法自動工作。

+1

http://www.trenki.net/content/view/17/1/,http://drdobbs.com/cpp/184401992?pgno=1,或者推出自己的。它並不特別棘手。 –

相關問題