我有这段代码:
int num1 = 11*2;
int num2 = 4;
double d = num2 / num1;
Console.WriteLine(d);
为什么结果为0并且没有被转换为double,或者为显式转换丢失提供错误?
答案 0 :(得分:3)
它是整数除法,在大多数编程语言中都很常见。除以2个整数可以得到最大的整数,而使用模数运算符可以得到余数22 % 4 = 2
。
如果你想从计算中得到double值,你需要先将一个整数转换为double:
double d = (double)num2/num1;
或
double d = num2/(double)num1;
另一方面,这不会给你你期望的结果,因为整数除法将首先出现,你将把该值转换为double:
double d = (double)(num2/num1);
网上有很多关于这个主题的资料。几个地方看:
https://en.wikipedia.org/wiki/Division_(mathematics)#Of_integers http://mathworld.wolfram.com/IntegerDivision.html
答案 1 :(得分:2)
整数除法返回整数结果。它的定义与C#语言规范中的定义相同。为什么?因此整数在基本数学运算符(+, - ,*,/)下是closed。另外,如果返回类型不是整数,它应该是什么? C#中有3种内置浮点类型 - float
,double
和decimal
。
您必须要注意,在C#中,表达式的类型决不会取决于分配结果的变量的类型。因此编译器永远不会检查d
的类型是否为double
,因此它可以执行浮点除法而不是整数除法。
如果您需要double
分区,请至少将其中一个操作数强制转换为double
double d = (double)num2 / num1;
答案 2 :(得分:1)
这并不是那样的。当你除去两个整数时,你会得到一个整数结果,当它试图隐式地将它转换为double时,它就会失败。
你要做的是
{{1}}
将其中至少一个强制转换为double,因此编译器可以理解 这是你想要的分数师。
答案 3 :(得分:0)
当执行整数除法时,在分割两个整数时会截断小数点。你必须明确地转换为double double d = double(num2)/ num1;
答案 4 :(得分:0)
因为C#是一种强类型语言,并且对一个操作的相同类型的操作数通常会产生相同类型的值,除非有一些隐式运算符执行相反的操作。
为什么结果为0
因为结果是0,1818181818181818
,并且因为操作数是int
,所以无法表示结果,因此它会被截断。
如果您想获得double
结果,则必须将这些整数明确地转换为double
:
int num1 = 11*2;
int num2 = 4;
double d = (double)num2 / (double)num1;
Console.WriteLine(d);