为什么c#中的整数除法返回整数而不是浮点?

pxq42qpu  于 2021-06-25  发布在  Mysql
关注(0)|答案(8)|浏览(505)

有人知道为什么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'

严格地说,没有整数除法(根据定义,除法是一种产生有理数的运算,整数是有理数的一个很小的子集)

2fjabf4q

2fjabf4q1#

作为一个小技巧,您可以使用var来知道您获得了什么,因此编译器将告诉您期望的类型:

int a = 1;
int b = 2;
var result = a/b;

你的编译器会告诉你结果的类型是int。

o3imoua4

o3imoua42#

这只是一个基本的操作。
还记得你学会分裂的时候吗。一开始我们解决了 9/6 = 1 with remainder 3 .

9 / 6 == 1  //true
9 % 6 == 3 // true

/-运算符与%-运算符组合用于检索这些值。

qybjjes1

qybjjes13#

结果总是分子和分母范围较大的类型。异常是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

浮点类型和十进制类型之间没有隐式转换,因此不允许在它们之间进行除法。您必须显式地强制转换并决定所需的类型(与浮点类型相比,decimal具有更高的精度和更小的范围)。

x0fgdtte

x0fgdtte4#

因为你不使用任何后缀,文字 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。
如果希望除法是浮点除法,则必须将结果设为浮点:

float x = 13 / 4;

注意,您仍然将整型除法,它将隐式地转换为float:结果将是 3.0 . 使用 f 后缀( 13f , 4f ).

ztmd8pv5

ztmd8pv55#

见c规范。除法运算符有三种类型
整数除法
浮点除法
十进制除法
在您的情况下,我们使用整数除法,并应用以下规则:
除法将结果向零舍入,结果的绝对值是可能的最大整数,该整数小于两个操作数商的绝对值。当两个操作数的符号相同时,结果为零或正;当两个操作数的符号相反时,结果为零或负。
我认为c#对整数使用这种除法(有些语言返回浮点结果)的原因是硬件-整数除法更快更简单。

7cwmlq89

7cwmlq896#

可能有用:

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
kuhbmx9i

kuhbmx9i7#

每个数据类型都能够重载每个运算符。如果分子和分母都是整数,整数类型将执行除法运算并返回整数类型。如果要进行浮点除法,则必须先将一个或多个数字转换为浮点类型,然后再进行除法。例如:

int x = 13;
int y = 4;
float x = (float)y / (float)z;

或者,如果您使用的是文字:

float x = 13f / 4f;

请记住,浮点是不精确的。如果您关心精度,请使用类似decimal的类型。

4szc88ey

4szc88ey8#

虽然新程序员在实际打算使用浮点除法时经常犯这种执行整数除法的错误,但在实际操作中整数除法是一种非常常见的操作。如果您假设人们很少使用它,并且每次除法时都需要记住转换为浮点,那么您就错了。
首先,整数除法要快得多,所以如果只需要一个整数结果,就需要使用更有效的算法。
第二,有许多算法使用整数除法,如果除法的结果总是浮点数,那么每次都将被迫对结果进行四舍五入。我脑子里的一个例子就是改变一个数字的基数。计算每一位数字时,需要将一个数与余数进行整数除法,而不是将该数进行浮点除法。
由于这些(以及其他相关的)原因,整数除法产生整数。如果你想得到两个整数的浮点除法,你只需要记住把一个转换成一个 double / float / decimal .

相关问题