2009-05-19 52 views

回答

19

不,你不知道。但是,你的表情几乎肯定不会达到你想要的。

表达式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); 

加法和减法是好的,因为使用浮点运算来进行的ab力他们的类型 - 但由于分立比加法和减法“结合得更紧” (即,就像使用上面的括号一样),只考虑直接操作数。

这有道理吗?

编辑:由于它是如此受欢迎,它是有道理的,包括在这里devinb的评论太:

double result = a - b + 1.0/12.0 + 3.0/12.0; 

这都是同样的事情,至于编译器来说 - 你只需要决定哪些是更清晰你:

(double) 1 
1.0 
1d 
+0

使用(双)1 /(双)12 +(双)3 /(双)12是否更合适?我意识到算术运算会促进这种类型,但至少对我来说,明确地描述一切事物的演员似乎更清楚。 – 2009-05-19 19:53:15

2

不,不需要铸造。

0

你不应该需要,虽然很难从你的问题中知道演员会在哪里。

0

当进行数学运算时,C#将返回结果作为哪个参数类型较大的类型。

我记得,顺序是这样的(从大到小):

  1. 小数
  2. 浮动
  3. 长/ Int64的
  4. INT/INT32
  5. short/int16
  6. byte

当然,这是跳过每个这些的未签名版本。

0

通常不需要转换,但在您的示例中,1/123/12是整数除法,每个表达式的结果为0。您需要将其中一个分子或分母投射到double

0

铸造用于指示何时将某个数据类型更改为其他类型。这是因为更改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只有在其出售的整数的相关信息。

2

嗯 - ,我已经做到了这一点的整数除法问题的办法是做这样的事情:

double result = a - b + 1/12.0 + 3/12.0 
那些虽然,就不需要铸造

除了。

2

当然,有一个干净的方式来做到这一点没有铸造:

double result = a - b + 1.0/12 + 3.0/12; 
2

这真的取决于你问什么铸造。这里有两种不同的情况:

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完成。