为什么双舍入而不是十进制?

时间:2018-11-08 12:20:28

标签: c# decimal

以下C#代码:

int n = 3;
double  dbl = 1d / n;
decimal dec = 1m / n;
Console.WriteLine(dbl * n == 1d);
Console.WriteLine(dec * n == 1m);

输出

True
False

很显然,doubledecimal都不能精确代表1/3。但是dbl * n会四舍五入,而dec * n不会四舍五入。为什么?该行为记录在哪里?

更新

请注意,我的主要问题是为什么他们的行为有所不同。假设四舍五入的选择是在设计IEEE 754和.NET时有意识地做出的选择,我想知道选择一种舍入类型而不是另一种类型的原因是什么。在上面的示例中,尽管double的有效位数少于decimal,但在产生数学上正确的答案方面似乎表现更好。为什么decimal的创建者不使用相同的舍入?在某些情况下,decimal的现有行为会更有利吗?

1 个答案:

答案 0 :(得分:0)

测试:

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。 但是3 * 0.3 --- 3(以10为底)-无过载,结果为0.9 --- 9