2013-04-22 96 views
0

我有一個浮點數,說1.2999,當放入Convert.ToDecimal回報1.3。我想將數字轉換爲小數的原因是加法和減法時的精度,而不是四捨五入。我確信小數類型可以保存這個數字,因爲它可以保存比float數字更大的數字。轉換爲十進制沒有四捨五入

爲什麼四捨五入的數量嗎?無論如何阻止它四捨五入?

編輯:我不知道爲什麼我的是四捨五入而你的是不是,這是我的確切代碼:

decNum += Convert.ToDecimal((9 * 0.03F) + 0); 

我真搞不清楚了。當我進入調試器並看到​​部分的輸出時,它將0.269999981顯示爲浮點數,但隨後將其轉換爲十進制0.27。但我知道9的3%是0.27。那麼這是否意味着原來的計算是不正確的,而轉換隻是修復它?

哎呀我討厭數字這麼多笑!

+0

它應該有效。 – 2013-04-22 12:27:31

+0

@HseseinNarimaniRad同意。它不會在我的機器上四捨五入。 – 2013-04-22 12:27:52

+3

無法重現。 'Console.WriteLine(Convert.ToDecimal(1.2999));'打印'1.2999'。 – Heinzi 2013-04-22 12:28:28

回答

7

你說的是發生似乎並沒有發生什麼事。

這個程序:

using System; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      float f = 1.2999f; 
      Console.WriteLine(f); 
      Decimal d = Convert.ToDecimal(f); 
      Console.WriteLine(d); 
     } 
    } 
} 

打印:

1.2999 
1.2999 

我認爲當你的價值轉換爲字符串,你可能會遇到的問題。

此外,作爲ByteBlast低於所指出的,或許你給我們的錯誤的測試數據。

使用float f = 1.2999999999f;確實打印1.3

其原因是浮點值不夠精確代表1.299999999f準確。該特定值最終被四捨五入爲1.3 - 但請注意,這是一個正在四捨五入之前轉換爲十進制浮點價值

如果使用double代替float,這種情況不會發生,除非你去甚至更精確的數字(當你到達1.299999999999999

根據修改後的問題[編輯] ,我想它只是預期的舍入誤差,所以肯定閱讀以下內容:

詳見"What Every Computer Scientist Should Know About Floating-Point Arithmetic"

Also see this link(由Tim Schmelter在下面的評論推薦)。

另一件需要注意的事情是,調試器可能會顯示不同的精度級別的數字,其默認級別爲double.ToString()(或等效),因此可能會導致您看到稍微不同的數字。


旁白:

你可能有一些運氣的 「往返」 格式說明:

Console.WriteLine(1.299999999999999.ToString()); 
Prints 1.3 

但是:

Console.WriteLine(1.299999999999999.ToString("r")); 
Prints 1.2999999999999989 

(需要注意的是偷偷摸摸的小8日倒數第二位!)

爲了獲得最終精度,您可以使用the Decimal type,因爲您已經在做這些。這爲基數爲10的數字進行了優化,並提供了更多的精度數字。

但是,請注意,它比floatdouble慢幾百倍,並且它也可能遭受舍入誤差,儘管少得多。

+0

我想他只是搞砸了他的測試數據。試試'1.2999999999f;' – 2013-04-22 12:30:04

+0

@ByteBlast:使用'1.2999999999f',你甚至不需要'ToDecimal':'Console.WriteLine(1.2999999999f);'打印'1.3'。對於這個數字,我不認爲'浮動'具有足夠的精度。 – Heinzi 2013-04-22 12:30:56

+0

同樣在這裏,我得到了確切的輸出 – Stasel 2013-04-22 12:31:07