将int隐式转换为double

时间:2014-04-25 12:58:19

标签: c# implicit-conversion

所以,我有点困惑。我认为这应该有效: 在这种情况下, a b 都是整数(计数器准确)。

由于 a / b 可能包含小数位,因此显然无法使用。 因此,我推出了一个新的双重并在其中执行计算,如下所示:

double texturefactor = ((a / b) * 10);

这不符合我的预期, a / b 的结果始终是我在使用int存储执行计算时得到的结果结果。 另一方面,这有效:

double calculate1 = a;
double calculate2 = b;
double texturefactor = ((calculate1 / calculate2) * 10);

几个可能是愚蠢的问题 - 1.我确信这应该有效 - 我知道在某些情况下VS会抱怨我试图隐含地从一种类型转换为另一种类型 - 这就是我想要做的!为什么不呢,我错过了什么? :) 2.我是否应该将计数器a和b转换成双打并为自己省去转换的麻烦,还是那个麻烦?

8 个答案:

答案 0 :(得分:3)

a / b的结果是另一个整数,所以即使你这样做,损坏也已经完成了:

double texturefactor = ((a / b) * 10);

尝试将您的一个内部变量投射到double

var texturefactor = (( (double)a / b) * 10);

(double)a / b的结果将是双倍的,您不会失去分数。

回答你的第二个问题:

  

我应该将计数器a和b转换为双打

那也行得通。如果您将其更改为double,则无需执行上述演员。

答案 1 :(得分:2)

当你有表达式(a / b)时,C#编译器会忽略它稍后将被分配给double。它只关注该表达式,并查看int / int,因此它使用integer division。这意味着您的结果会在转换为double之前向下舍入到下一个整数。

您需要确保C#将该部门视为double s的一个部门,而不是int s,例如:

double texturefactor = (((double)a / b) * 10); // or
double texturefactor = 10d * a / b; // or
double texturefactor = 10.0 * a / b;

答案 2 :(得分:2)

表达式,包括子表达式的类型,从内到外进行评估:

double texturefactor = ((a / b) * 10);

当编译器分析a / b时,它不知道稍后会将结果转换为double,因此它只是将计算编译为整数除法。

将两个操作数中的一个显式地强制转换为double就足以避免这种混淆:

double texturefactor = (((double)a / b) * 10);

答案 3 :(得分:1)

double texturefactor = ((a / b) * 10);无效的原因是右侧的所有参数都是int类型,因此计算在int而不是double进行您认为。

您可以明确地将ab转换为加倍。像

double texturefactor = (((double) a / b) * 10);

在您将ab定义为double之后的第二个代码中,现在计算以double类型完成。

答案 4 :(得分:1)

您需要将int值转换为double:

int a = some_value;
int b = some_value;
double texturefactor = (double)a / b * 10;

答案 5 :(得分:0)

整数除法不会因为您将其值分配给double变量而具有小数值。

如果你想要精确度,那么你的第二种方法非常好。

double calculate1 = a;
double calculate2 = b;
double texturefactor = ((calculate1 / calculate2) * 10);

以上是好的。

我不建议你把它投入double,因为要付出一些开销。

答案 6 :(得分:0)

  

因此,我推出了一个新的双重并在其中执行计算:

啊,不。

  

double texturefactor =((a / b)* 10);

基本语法。你声明一个double(texturefactor)。您为它分配纯整数运算的结果 - (a / b)* 10

由于优先级,这是a / b(整数,丢弃数字)乘以10.然后隐式收敛。

典型的初学者错误 - 但很多人都这样做。

您需要双重算术,确保任何元素都是双精度数,例如:

((double)a / b)* 10

将为所有元素执行浮动piont转换。

答案 7 :(得分:0)

除以两个整数的结果始终整数。所以你需要

double texturefactor = (((double)a / b) * 10);