要返回一个double,即使c#中的类型是double,我是否必须转换为double?

时间:2009-05-19 19:48:19

标签: c# casting

要返回一个双精度型,即使类型是双倍,我是否必须强制转换为双倍?

e.g。

double a = 32.34;
double b = 234.24;

double result = a - b + 1/12 + 3/12;

我必须演员(双人)?

9 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

不,不需要施法。

答案 2 :(得分:2)

嗯 - 我为整数除法问题做的就是这样做:

double result = a - b + 1/12.0 + 3/12.0

除此之外,不需要任何铸造。

答案 3 :(得分:2)

当然,如果不进行投射,有一种干净的方法:

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

答案 4 :(得分: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的整数来完成的。

答案 5 :(得分:0)

你不应该这样做,虽然很难从你的问题中判断演员的位置。

答案 6 :(得分:0)

在进行数学运算时,C#会将结果作为具有较大类型的参数的类型返回。

我记得,订单是这样的(从大到小):

  1. 小数
  2. long / int64
  3. int / int32
  4. short / int16
  5. 字节
  6. 当然,这是跳过其中每个的无符号版本。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

转换用于指示何时要将一种数据类型更改为另一种类型。这是因为更改type通常会导致数据丢失。

e.g。

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仅具有可用的整数相关信息。