C#中的数字类型后缀

时间:2014-04-30 06:52:09

标签: c# double decimal

我在发布之前首先搜索了这个问题,但我得到的只是基于C ++。 这是我的问题: 在c#中是f后缀正常的双精度?如果是,为什么以及如何做到这一点?

看一下这段代码:

double d1 = 1.2f;
double d2 = 2.0f;

Console.WriteLine("{0}", d2 - d1);

decimal dm1 = 1.2m;
decimal dm2 = 2.0m;

Console.WriteLine("{0}", dm2 - dm1);

第一次计算的答案是0.799999952316284,f后缀而不是0.8。此外,当我将f更改为d时,我认为应该是正常的方式,它给出了0.8的正确答案。

3 个答案:

答案 0 :(得分:2)

右手表达式被评估为float,然后“存入”double变量。这里没有错或奇怪。我认为结果的差异与两种数据类型的精度有关。

参考您对“正确答案”的理解,0.8出现“正确”这一事实不是因为您从浮动字面值变为双字面值。这只是结果的更好近似值。 “正确”的结果确实来自第二个表达式,即使用decimal类型的表达式。

答案 1 :(得分:1)

f后缀代表float而非double。所以1.2f是一个单一的精确浮点数,在创建它之后将直接保存为double,因为隐式转换为double。

你所得到的骄傲似乎正在那里发生而不是计算,因为它似乎与1.2d一起使用。

使用浮点值时,这种行为是正常的。如果您不想要自己在自己的示例中做过的行为,请使用decimal ...

答案 2 :(得分:1)

Double和Float都是二进制数字。

问题不在于它们的精确度,而是类型的数字它们可以以精确的方式存储,它们也必须是二进制的。将1.2f改为0.5f的0.25f或0.125f等等,你会看到'正确'的结果。但是,任何具有不同阶乘的数字都必须存储在近似值中。 1.2中有一个'3'隐藏,你无法存入浮点数或双精度数。如果您尝试,只会存储近似值。

小数实际上是存储十进制数字,只要不离开十进制域,就不会看到任何近似值。如果你试图以小数形式存储1/3,它也必须近似..