要返回一个双精度型,即使类型是双倍,我是否必须强制转换为双倍?
e.g。
double a = 32.34;
double b = 234.24;
double result = a - b + 1/12 + 3/12;
我必须演员(双人)?
答案 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);
加法和减法是可以的,因为a
和b
的类型迫使它们使用浮点运算来执行 - 但是因为除法“比加法和减法更紧密”(即它是比如使用上面的括号)只考虑立即操作数。
这有意义吗?
编辑:因为它如此受欢迎,所以在这里包含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#会将结果作为具有较大类型的参数的类型返回。
我记得,订单是这样的(从大到小):
当然,这是跳过其中每个的无符号版本。
答案 7 :(得分:0)
通常不需要强制转换,但在您的示例中,1/12
和3/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仅具有可用的整数相关信息。