要返回一个双精度型,即使类型是双精度型,我是否必须施加双精度?要返回一个双精度型,即使类型在c#中是双精度型,我也必须进行双精度型转换?
例如
double a = 32.34;
double b = 234.24;
double result = a - b + 1/12 + 3/12;
我一定要投(双)?
要返回一个双精度型,即使类型是双精度型,我是否必须施加双精度?要返回一个双精度型,即使类型在c#中是双精度型,我也必须进行双精度型转换?
例如
double a = 32.34;
double b = 234.24;
double result = a - b + 1/12 + 3/12;
我一定要投(双)?
不,你不知道。但是,你的表情几乎肯定不会达到你想要的。
表达式1/12和3/12将使用整数算术执行。
你可能想:
double result = a - b + 1/12d + 3/12d;
或
double result = a - b + 1/(double) 12 + 3/(double) 12;
这两项将强制使用浮点运算来进行划分。
这里的问题是,如果算术运算符的两个操作数都是整数,则操作是使用整数运算,即使它是一个更大的表达,其是类型double
的一部分来执行。在这里,你的表达是有效:
double result = a - b + (1/12) + (3/12);
加法和减法是好的,因为使用浮点运算来进行的a
和b
力他们的类型 - 但由于分立比加法和减法“结合得更紧” (即,就像使用上面的括号一样),只考虑直接操作数。
这有道理吗?
编辑:由于它是如此受欢迎,它是有道理的,包括在这里devinb的评论太:
double result = a - b + 1.0/12.0 + 3.0/12.0;
这都是同样的事情,至于编译器来说 - 你只需要决定哪些是更清晰你:
(double) 1
1.0
1d
不,不需要铸造。
你不应该需要,虽然很难从你的问题中知道演员会在哪里。
当进行数学运算时,C#将返回结果作为哪个参数类型较大的类型。
我记得,顺序是这样的(从大到小):
当然,这是跳过每个这些的未签名版本。
通常不需要转换,但在您的示例中,1/12
和3/12
是整数除法,每个表达式的结果为0。您需要将其中一个分子或分母投射到double
。
铸造用于指示何时将某个数据类型更改为其他类型。这是因为更改type
通常会导致数据丢失。
例如
double a = 8.49374;
//casting is needed because the datatypes are different.
// a_int will end up with the value is 8, because the precision is lost.
int a_int = (int) a;
double b = (double) a_int;
在那个例子中的“B”将结束的值“8.00000 ......”这是因为a_int不含任何小数的信息,所以B只有在其出售的整数的相关信息。
嗯 - ,我已经做到了这一点的整数除法问题的办法是做这样的事情:
double result = a - b + 1/12.0 + 3/12.0
那些虽然,就不需要铸造
除了。
当然,有一个干净的方式来做到这一点没有铸造:
double result = a - b + 1.0/12 + 3.0/12;
这真的取决于你问什么铸造。这里有两种不同的情况:
double a = 32.34;
double b = 234.24;
double result1 = a - b + 1/12 + 3/12;
double result2 = a - b + (double)1/12 + (double)3/12;
Console.WriteLine(result1); // Result: -201.9
Console.WriteLine(result2); // Result: -201.566666666667
无论哪种方式,你不会得到有关分配的价值造成任何投诉,但在第一种情况下在最后的除法使用整数其决心0完成。
使用(双)1 /(双)12 +(双)3 /(双)12是否更合适?我意识到算术运算会促进这种类型,但至少对我来说,明确地描述一切事物的演员似乎更清楚。 – 2009-05-19 19:53:15