[英]Why is double rounded and decimal is not?
以下C#代碼:
int n = 3;
double dbl = 1d / n;
decimal dec = 1m / n;
Console.WriteLine(dbl * n == 1d);
Console.WriteLine(dec * n == 1m);
輸出
True
False
顯然, double
精度和decimal
都不能decimal
表示1/3。 但是dbl * n
舍入為1,而dec * n
dbl * n
入。 為什么? 該行為記錄在哪里?
UPDATE
請注意,我的主要問題是為什么他們的行為有所不同。 假設四舍五入的選擇是在設計IEEE 754和.NET時有意識地做出的選擇,我想知道選擇一種舍入類型而不是另一種類型的原因是什么。 在上面的示例中,盡管有效位數少於decimal
但double
似乎在產生數學上正確的答案方面表現更好。 為什么decimal
的創建者不使用相同的舍入? 是否存在使現有的decimal
行為更有利的方案?
測試:
int n = 3;
double dbl = 1d / n;
decimal dec = 1m / n;
Console.WriteLine("/n");
Console.WriteLine(dbl);
Console.WriteLine(dec);
Console.WriteLine("*n");
Console.WriteLine(dbl * n);
Console.WriteLine(dec * n);
結果:
/n
0.333333333333333
0.3333333333333333333333333333
*n
1
0.9999999999999999999999999999
用基數10,雙精度和單基數2保存的十進制數。可能在cpu中3 * 0.333333333333333333之后為double的二進制過載和結果1。但是基數10的3 * 0.3 --- 3-無過載,結果0.9 --- 9
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.