首页 文章

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

提问于
浏览
104

有谁知道为什么C#中的整数除法返回一个整数而不是浮点数?它背后的想法是什么? (它只是C / C的遗产吗?)

在C#中:

float x = 13 / 4;   
//imagine I used have an overridden == operator here to use epsilon compare
if (x == 3.0)
   print 'Hello world';

此代码的结果将是:

'Hello world'

严格来说,没有整数除法这样的东西(按定义除法是产生有理数的运算,整数是其中一小部分 . )

7 回答

  • 67

    可能有用:

    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
    
  • 63

    虽然新程序员在实际意图使用浮点除法时犯这种执行整数除法的错误是常见的,但在实际操作中,整数除法是一种非常常见的操作 . 如果你假设人们很少使用它,并且每次你进行除法你总是需要记住施放到浮点,你就错了 .

    首先,整数除法要快得多,所以如果你只需要一个整数结果,就可以使用更有效的算法 .

    其次,有许多算法使用整数除法,如果除法的结果总是浮点数,那么每次都要强制舍入结果 . 我头顶的一个例子是改变一个数字的基数 . 计算每个数字涉及数字的整数除以及余数,而不是数字的浮点除法 .

    由于这些(和其他相关的)原因,整数除法产生整数 . 如果你想得到两个整数的浮点除法,你只需要记住将一个转换为 double / float / decimal .

  • 29

    它只是 basic operation .

    记得当你学会划分时 . 一开始我们解决了 9/6 = 1 with remainder 3 .

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

    / -operator与%-operator结合使用来检索这些值 .

  • 6

    结果将始终是具有更大范围的分子和分母的类型 . 例外是字节和短,产生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具有更高的精度和更小的范围) .

  • 10

    由于您不使用任何后缀,因此文字 134 被解释为整数:

    手动:如果文字没有后缀,则它具有第一种类型,其值可以表示为:int,uint,long,ulong .

    因此,由于您将 13 声明为整数,因此将执行整数除法:

    手动:对于x / y格式的操作,应用二元运算符重载决策来选择特定的运算符实现 . 操作数转换为所选运算符的参数类型,结果的类型是运算符的返回类型 . 下面列出了预定义的除法运算符 . 运算符都计算x和y的商 . 整数除法:int运算符/(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 后缀( 13f4f )将操作数显式声明为float .

  • 3

    见C#specification . 有三种类型的除法运算符

    • 整数除法

    • 浮点除法

    • 十进制除法

    在您的情况下,我们有Integer部门,并应用以下规则:

    除法将结果舍入为零,结果的绝对值是最大可能的整数,小于两个操作数的商的绝对值 . 当两个操作数具有相同符号时,结果为零或正,当两个操作数具有相反符号时,结果为零或负 .

    我认为C#使用这种类型的除法进行整数(某些语言返回浮动结果)的原因是硬件 - 整数除法更快更简单 .

  • 1

    每种数据类型都能够使每个运算符重载 . 如果分子和分母都是整数,则整数类型将执行除法运算,它将返回整数类型 . 如果你想要浮点除法,你必须在划分它们之前将一个或多个数字转换为浮点类型 . 例如:

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

    或者,如果您使用文字:

    float x = 13f / 4f;
    

    请记住,浮点不精确 . 如果您关心精度,请使用十进制类型 .

相关问题