隐含地将int转换为double
本文关键字:转换 double int | 更新日期: 2023-09-27 18:00:12
所以,我有点困惑。我的印象是,这应该奏效:在这种情况下,a和b都是int(确切地说是计数器)。
由于a/b可能包含小数点,int显然不起作用。因此,我延迟了一个新的替身,并在里面进行了这样的计算:
double texturefactor = ((a / b) * 10);
这并没有像我预期的那样起作用,a/b的结果总是我使用int来存储结果时会得到的结果。另一方面,这是有效的:
double calculate1 = a;
double calculate2 = b;
double texturefactor = ((calculate1 / calculate2) * 10);
几个也许很愚蠢的问题-1.我相信这应该奏效——我知道在某些情况下,VS会抱怨我试图隐式地从一种类型转换到另一种类型——这就是我要做的!为什么没有,我错过了什么吗?:)2.我应该把计数器a和b转换成两倍,省去转换的麻烦吗?
a / b
的结果是另一个整数,所以即使你这样做,伤害也已经造成了:
double texturefactor = ((a / b) * 10);
尝试将一个内部变量强制转换为double
:
var texturefactor = (( (double)a / b) * 10);
(double)a / b
的结果将是一个二重,并且您不会丢失您的分数。
回答您的第二个问题:
我应该将计数器a和b转换为双倍吗
那也行。如果您将其更改为double
,则不必执行上述强制转换。
表达式,包括子表达式的类型,是从内到外求值的:
double texturefactor = ((a / b) * 10);
当编译器分析a / b
时,它不知道结果稍后会转换为double
,所以它只是将计算编译为整数除法。
将两个操作数中的一个显式强制转换为double
就足以避免这种混淆:
double texturefactor = (((double)a / b) * 10);
当您有表达式(a / b)
时,C#编译器会忽略它稍后将被分配给double
。它只关注该表达式,并看到int / int
,因此它使用整数除法。这意味着,在将结果转换为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;
此double texturefactor = ((a / b) * 10);
不起作用的原因是右侧的所有参数都是int
类型,因此计算是在int
中进行的,而不是您认为的double
。
可以将a
或b
显式强制转换为双精度。像
double texturefactor = (((double) a / b) * 10);
在您的第二个代码中,由于您将a
和b
定义为double,现在计算是以double类型完成的。
您需要将int值强制转换为double:
int a = some_value;
int b = some_value;
double texturefactor = (double)a / b * 10;
整数除法不会因为将其值分配给double
变量而具有十进制值。
如果你想要精确,那么你的第二种方法是相当好的。
double calculate1 = a;
double calculate2 = b;
double texturefactor = ((calculate1 / calculate2) * 10);
以上内容不错。
我不建议您将其转换为double
,因为需要支付一些管理费用。
两个整数的除法结果是总是一个整数。所以你需要
double texturefactor = (((double)a / b) * 10);
因此,我延迟了一个新的替身,并在里面进行了这样的计算:
啊,没有。
双文本重构器=((a/b)*10);
基本语法。您声明了一个double(texture重构)。你给它分配一个纯整数运算的结果-(a/b)*10
由于先例,这是a/b(整数,丢弃数字)乘以10。然后是隐含的矛盾。
典型的初学者错误-但很多人都会犯。
如果想要一个二重算术,请确保任何元素都是二重的,例如:
(双)a/b)*10
将对所有元素进行浮点π介子转换。