我在发布之前首先搜索了这个问题,但我得到的只是基于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的正确答案。
答案 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,它也必须近似..