有谁知道为什么C#中的整数除法返回整数而不是浮点数?它背后的想法是什么?(这仅仅是C / C ++的遗产吗?)
在C#中:
float x = 13 / 4;
//== operator is overridden here to use epsilon compare
if (x == 3.0)
print 'Hello world';
该代码的结果将是:
'Hello world'
严格来说,没有整数除法(按定义除法是产生有理数的运算,整数是其中的一个很小的子集。)
有谁知道为什么C#中的整数除法返回整数而不是浮点数?它背后的想法是什么?(这仅仅是C / C ++的遗产吗?)
在C#中:
float x = 13 / 4;
//== operator is overridden here to use epsilon compare
if (x == 3.0)
print 'Hello world';
该代码的结果将是:
'Hello world'
严格来说,没有整数除法(按定义除法是产生有理数的运算,整数是其中的一个很小的子集。)
Answers:
虽然新程序员在实际上打算使用浮点除法时经常犯执行整数除法的错误,但实际上,整数除法是一种非常常见的操作。如果您假设人们很少使用它,并且每次进行除法操作时,您总是需要记住将其转换为浮点数,那您就错了。
首先,整数除法要快得多,因此,如果您只需要整数结果,则可以使用更高效的算法。
其次,有许多使用整数除法的算法,如果除法的结果始终是浮点数,则每次都将被迫舍入结果。我脑海中的一个例子是改变数字的底数。计算每个数字涉及数字与整数的除法运算,而不是数字的浮点除法。
由于这些(以及其他相关的)原因,整数除法会得出整数。如果你想获得两个整数的浮点除法你只需要记住一个铸到double/ float/ decimal。
/运算符将执行整数还是浮点除法(除非您使用的是动态运算)。如果由于在一行上执行了太多操作而使您难以弄清楚,那么我建议您将该行分成几行,以便更容易确定操作数是整数还是浮点类型。您的代码的未来读者可能会喜欢它。
int/int运算符完全是非法的([诊断指定代码必须强制转换操作数或使用其他操作员,具体取决于所需的行为]。如果还有一些其他好的令牌序列可用于整数除法,则有可能不赞成/为此目的使用它,但是我不知道这是实用的。
每种数据类型都能使每个运算符过载。如果分子和分母都是整数,则整数类型将执行除法运算,并将返回整数类型。如果要进行浮点除法,则必须先将一个或多个数字转换为浮点类型,然后再进行除法。例如:
int x = 13;
int y = 4;
float x = (float)y / (float)z;
或者,如果您使用文字:
float x = 13f / 4f;
请记住,浮点数并不精确。如果您在乎精度,请改用小数类型。
由于您不使用任何后缀,因此将文字13和4解释为整数:
手册:
如果文字没有后缀,它具有第一这些类型的,其中它的值可以表示的:
int,uint,long,ulong。
因此,由于您声明13为整数,因此将执行整数除法:
手册:
对于x / y形式的操作,将应用二进制运算符重载解析来选择特定的运算符实现。操作数将转换为所选运算符的参数类型,结果的类型为运算符的返回类型。
预定义的除法运算符在下面列出。运算符都计算x和y的商。
整数除法:
int operator /(int x, int y); uint operator /(uint x, uint y); long operator /(long x, long y); ulong operator /(ulong x, ulong y);
因此四舍五入发生:
除法将结果舍入为零,并且结果的绝对值是最大可能的整数,该整数小于两个操作数的商的绝对值。当两个操作数具有相同的符号时,结果为零或正;而当两个操作数具有相反的符号时,结果为零或负。
如果您执行以下操作:
int x = 13f / 4f;
您会收到编译器错误,因为浮点除法(的/运算符13f)会导致产生浮点数,而该浮点数不能隐式转换为int。
如果希望除法是浮点除法,则必须将结果设为浮点数:
float x = 13 / 4;
请注意,您仍将除以整数,该整数将隐式转换为float:结果将为3.0。使用f后缀(13f,4f)将操作数显式声明为float 。
1.0。
可能有用:
double a = 5.0/2.0;
Console.WriteLine (a); // 2.5
double b = 5/2;
Console.WriteLine (b); // 2
int c = 5/2;
Console.WriteLine (c); // 2
double d = 5f/2f;
Console.WriteLine (d); // 2.5
2.5,而不是2。
结果将始终是具有更大范围的分子和分母的类型。byte和short例外,它们产生int(Int32)。
var a = (byte)5 / (byte)2; // 2 (Int32)
var b = (short)5 / (byte)2; // 2 (Int32)
var c = 5 / 2; // 2 (Int32)
var d = 5 / 2U; // 2 (UInt32)
var e = 5L / 2U; // 2 (Int64)
var f = 5L / 2UL; // 2 (UInt64)
var g = 5F / 2UL; // 2.5 (Single/float)
var h = 5F / 2D; // 2.5 (Double)
var i = 5.0 / 2F; // 2.5 (Double)
var j = 5M / 2; // 2.5 (Decimal)
var k = 5M / 2F; // Not allowed
浮点类型和十进制类型之间没有隐式转换,因此不允许在它们之间进行除法。您必须明确地强制转换并决定要使用哪一种(与浮点类型相比,十进制具有更高的精度和更小的范围)。
integer师而不是floating point师