2013-04-02 47 views
3

在我的c#控制檯應用程序中,我想將雙變量轉換爲字符串類型。但結果字符串變量的小數點左邊至少應該有3位數字,右邊有一位數字。 例如:3.4569應該轉換爲「003.4」tostring(「000.0」)生成錯誤值

它適用於上面的示例,但會爲以下轉換引發錯誤的結果。

double Num = Math.Pow((3 + Math.Sqrt(5)), N); //6578336356630531.0 for N=22 
string StringNum = Num .ToString("000.0"); 

它的結果..

StringNum ="6578336356630530.0"; 

但它會..

StringNum ="6578336356630531.0"; 

我如何獲得這些類型的數字的確切字符串值?

//decimal Num=Convert.ToDecimal (Math.Pow((3 + Math.Sqrt(5)), N)); 
//this conversion also looses original value 

感謝名單..

+7

看來你是精確的邊緣。 (6578336356630531.0 == 6578336356630530.0)Console.WriteLine(「Precision problem」);' – Aneri

+0

我得到N = 22作爲輸入 然後我使用N作爲如下, Num = Math.Pow((3 + Math。 Sqrt(5)),N); //6578336356630531.0 所以對於數學函數我用雙變量.. –

+0

@ durgesh.patle kay bhau,tya yed *** ghabarun tumhi post delete kelit? aaho marathi aahat tumhi marathi ... – Freelancer

回答

3

問題是你存儲的值究竟是6578336356630531。沒有double值更接近6578336356630530.所以輸出對於執行時存在的數據是正確的。

the documentation來自:

所有浮點數也有顯著位的數量有限,這也決定了一個浮點值,如何準確地近似一個實數。 Double值最多有15個十進制數字的精度,但內部最多保留17位數字。

你對第16位數字有些嘀咕。

我有一個handy class它可以讓你看到確切價值的任何double

如果您需要更高的精度,請使用decimal而不是double。請注意,decimal具有較小的範圍但精度更高。

+0

Thanx先生,但\t 我得到N = 22作爲輸入和使用如下,Num = Math.Pow((3 + Math.Sqrt(5)),N); //6578336356630531.0所以對於數學函數我使用了雙變量,我不能使用pow或者sqrt和小數點 –

+0

@ durgesh.patle:那麼你只需要明白,如果你使用'double',你應該忽略15號以後的任何東西有效數字。你試圖達到的數字基本上不能代表「雙倍」。 –

0

使用decimal而不是double,一切都會OK:

decimal Num = 6578336356630531.0m; 
string StringNum = Num.ToString("000.0"); 

,問題是雙重價值的代表性和精密連接。

0

double無法存儲該精度。如果這是您想要的行爲,請使用decimal

0

看起來您已經找到了一個無法正確表示浮點數的數字。

嘗試使用十進制來代替:

decimal Num = 6578336356630531.0m; 
string StringNum = Num.ToString("###.0"); 
2

你能使用十進制?

decimal Num = 6578336356630531.0M; 
string StringNum = Num .ToString("000.0"); 

double是一個接近精度的浮點數。 See here.

文章摘譯:

浮點值和精度

損失

記住, 浮點數只能近似於十進制數,而 一個浮點精度點號確定該數字近似於十進制數的準確程度。默認情況下,Double值 包含15位精度的十進制數字,儘管內部保留最多17位數。浮點數 的精度有以下幾點結果:對於特定精度而言,兩個浮點數看起來相等的兩個浮點數可能不會相當於相等的 ,因爲它們的最低有效位數不同。數學 或比較操作使用浮點數不可能 產生相同的結果,如果使用十進制數,因爲 浮點數可能不精確地接近小數 數字。如果涉及的浮點數是 ,則值可能不會往返。如果操作將一個操作將原始浮點數轉換爲另一種形式,則返回一個值,逆操作將轉換後的表格轉換回浮點數,並且最終浮點數等於原始值浮點數 。往返可能失敗,因爲一個或多個最不重要的 數字在轉換中丟失或更改。

+0

我將N作爲輸入 ,然後我使用N作爲如下, Num = Math.Pow((3 + Math.Sqrt(5)),N); //6578336356630531.0對於N = 22 因此對於數學函數我使用雙變量.. –

0

雙精度無整數的最大整數爲2^53 - 1,約爲9e15,但是您有6e15,這可能是寶貴的代表,但不一定。你有一個運氣不好(往往是運氣不好,處理它)。如果你想活得沒有這些驚喜,你必須在c#中使用十進制類型。

+0

錯誤:無舍入的最大精度爲2^52 - 1,這使得你的數字超過極限,它是沒有運氣,它的確定性它是圓形的。 –