在 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