赋值和使用双精度或浮点数在 C# 中不起作用



在 C# 中,为什么这能正常工作:

double dr = 1.5;

但这不会:

double dr = (double)(3/2);

后者等于 1

发生这种情况是因为在执行强制转换以double之前计算了代码的(3/2)位。因此,当执行该代码时,这些值是整数,因此计算的结果也是整数。这意味着结果的小数部分将被丢弃,结果是一个整数值:1

当您将其转换为双精度时,该值中已经没有记录任何分数。将其转换为双精度无法放回已删除的信息。

如果先将单个值转换为双精度值,或用小数点表示,它将起作用:

Console.WriteLine((double)(3/2));
Console.WriteLine(((double)3/(double)2));
Console.WriteLine(3.0/2.0);

输出

1
1.5
1.5

演示:https://dotnetfiddle.net/bJZteH

3 和 2 都是整数,所以如果你想让它工作,试试这个:

double dr = (double)(3.0/2.0);

因为你实际上是在做 2 个整数的除法,然后将其转换为双倍。 3/2 将导致 1.5 但是。 由于 3 和 2 是整数值,因此将其下限设置为 1,然后转换为双精度。

要使其正常工作,您需要:

var result = (double) (3.0/2.0);

结果取决于操作的执行顺序。

在您的示例代码中,只有在除法完成后才会强制转换为双精度(数字被视为整数(。如果你想实现双倍值,你可以这样做

double dr = 3d/2d; 

后缀 d(或 D(表示类型double

最新更新