你說的是發生似乎並沒有發生什麼事。
這個程序:
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的數字進行了優化,並提供了更多的精度數字。
但是,請注意,它比float
或double
慢幾百倍,並且它也可能遭受舍入誤差,儘管少得多。
它應該有效。 – 2013-04-22 12:27:31
@HseseinNarimaniRad同意。它不會在我的機器上四捨五入。 – 2013-04-22 12:27:52
無法重現。 'Console.WriteLine(Convert.ToDecimal(1.2999));'打印'1.2999'。 – Heinzi 2013-04-22 12:28:28