2012-02-20 51 views
0

我有下面的代碼snipppet。CString。格式問題

double db = 1/1000000; 
CString csStr(""; 
csStr.Format('%.10f',ct); 

基本上的db值爲0.000001
我需要將此值存儲爲csStr
MFC VC++中的格式語句是否正確?
另外,db可以是1/1001/100000000000

我不能在csStr中存儲trucated值或四捨五入的值。那可能嗎?

回答

1

你有兩個問題需要解決這裏:

  1. 浮點類型不是任意精度的類型,所以你不能保存您在他們想要的任何值。有些值會有精確的浮點表示,有些則不會。
  2. 即使您有任意的精度類型,也不能存儲其(通用)字符串表示。我的意思是,如果你計算1.0/3.0並且希望將其未截斷的,未被包圍的結果存儲在一個字符串中,你將需要無限的字符。

所以你問的是不可能的,一般來說。

現在,您所詢問的值有一個精確的有限小數位數,十進制表示形式(但並非所有這些都是精確的FP表示形式),並且感謝CString :: Format舍入函數,您如果你做得很好,最有可能得到存儲在csStr中的正確值。

您的代碼具有一定的問題(校正,使得它編譯):

double db = 1/1000000; // [1] 
CString csStr("");   // [2] 
csStr.Format("%.10f", db); // [3] 

[1]這存儲在分貝0.0。它將整除計算爲0,然後將其轉換爲雙精度。代替double db = 1.0/1e6;(或1.0/1000000)。

[2]你不需要初始值設定項。 CString被初始化爲空字符串

[3]這會在字符串中存儲「0.0000010000」。 如果您不想要尾隨零,請將「%lf」寫爲格式。 根據文檔,「該值四捨五入到合適的位數」。如果精度足夠了,你會得到正確的數字,但是如果你沒有足夠的精度(例如,如果你指定精度爲6,數字爲0.00000001),或者有零結尾達到指定的精度。

那該怎麼辦?就你而言,你說你會有1/100或1/100000000000。如果這是真的(你只能擁有這兩個值),並且它不會改變(這將取決於你在做什麼,但我不會相信這一點),你可以存儲除數,然後創建字符串在飛行中,與if什麼的。

您也可以使用「%g」格式規範。它也完成四捨五入,但它刪除任何尾隨的零。警告(或好東西,取決於你在做什麼)是它可以(並且將)以「1e-6」格式放置一些值。