在C#中,如果类型是double,要返回一个double值,是否需要进行double类型转换?

7

如果要返回一个double,即使类型是double,我是否需要转换为double?

例如:

double a = 32.34;
double b = 234.24;

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

我需要将(double)强制类型转换吗?

9个回答

18

不需要,但是你的表达式几乎肯定不能实现你想要的功能。

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

使用(double)1 / (double)12 + (double)3 / (double)12会更合适吧?我知道算术运算会提升类型,但至少对我来说,明确地描述每个转换似乎更清晰。 - Paul Sonier
为什么总是这样,如果突然出现了一个好的答案,几乎肯定是你的呢? ;) - User
4
此外,我相信 1.0/12.0 + 3.0/12.0 就可以解决问题,而不需要强制转换。虽然,暗示 Jon Skeet 漏掉了什么让我有点担心... - DevinB
1
@devinb:1.0/12.0 + 3.0/12.0 等价于 1d/12d + 3d/12d。这只是个人口味问题。我发现字母和点一样会吸引注意力,但如果你更喜欢点,那就用点吧。 - Jon Skeet
@Atomiton:这很公正——这是个人意见。另一方面,我希望在我工作的任何公司中,任何那么新的语言都能得到适当的指导:) (当然,12.0仍然可以是小数...) - Jon Skeet
显示剩余3条评论

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的整数进行。

2
不需要任何转换。

0

类型转换用于指示您何时想要将一种数据类型更改为另一种类型。这是因为更改 类型 通常涉及可能丢失数据的情况。

例如:

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'只能使用其可用的整数相关信息。

0
你应该不需要这样做,尽管从你的问题中很难确定需要进行转换的位置。

0

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

据我回忆,顺序大致如下(从大到小):

  1. decimal
  2. double
  3. float
  4. long / int64
  5. int / int32
  6. short / int16
  7. byte

当然,这里跳过了每个类型的无符号版本。


0
一般情况下不需要强制转换,但在你的例子中,1/12和3/12是整数除法,每个表达式的结果都是0。你需要将分子或分母之一强制转换为double类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接