所以,我有点困惑。我认为这应该有效: 在这种情况下, 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转换成双打并为自己省去转换的麻烦,还是那个麻烦?
答案 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
进行您认为。
您可以明确地将a
或b
转换为加倍。像
double texturefactor = (((double) a / b) * 10);
在您将a
和b
定义为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);