隐含地将int转换为double

本文关键字:转换 double int | 更新日期: 2023-09-27 18:00:12

所以,我有点困惑。我的印象是,这应该奏效:在这种情况下,ab都是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转换成两倍,省去转换的麻烦吗?

隐含地将int转换为double

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#将除法视为doubles的除法,而不是ints的除法。例如:

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

可以将ab显式强制转换为双精度。像

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

在您的第二个代码中,由于您将ab定义为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

将对所有元素进行浮点π介子转换。