C#中的积分和浮点运算之间的区别?

时间:2019-04-03 16:11:02

标签: c#

C#中的积分和浮点运算有什么区别?

我尝试在网上查找和阅读文章,但并没有直接回答问题。

1 个答案:

答案 0 :(得分:2)

几个算术运算符受整数和浮点逻辑的影响。使人绊倒的最常见的是divisor operator

  

整数除法

     

对于整数类型的操作数,/运算符的结果为整数类型,并且等于两个操作数的四舍五入到零的商:

     

浮点除法

     

对于浮点,双精度和十进制类型,/运算符的结果是两个操作数的商:

下面显示一个示例。

var intResult = 5/2; //result is 2, not 2.5
var doubleResult = 5/2.0; //result is 2.5

受整数与浮点逻辑影响的其他项目如下

remainder operator

  

整数余量

     

对于整数类型的操作数,%b的结果是a-(a / b)* b产生的值。非零余数的符号与第一个操作数的符号相同...

     

浮点余数

     

对于浮点和双精度操作数,有限x和y的x%y的结果是z使得

     
      
  • z的符号(如果非零)与x的符号相同。
  •   
  • z的绝对值是| x |产生的值。 -n * | y |其中n是小于或等于| x |的最大可能整数。 / | y |和| x |和| y |分别是x和y的绝对值。
  •   

remainder运算符只为整数和浮点运算生成一个余数。浮点余数的描述仅是更具描述性的,因为它对浮点值进行操作。示例如下所示

Console.WriteLine(5 % 4);   // output: 1
Console.WriteLine(5 % -4);  // output: 1
Console.WriteLine(-5 % 4);  // output: -1
Console.WriteLine(-5 % -4); // output: -1
Console.WriteLine(-5.2f % 2.0f); // output: -1.2
Console.WriteLine(5.9 % 3.1);    // output: 2.8
Console.WriteLine(5.9m % 3.1m);  // output: 2.8

另一个示例只是为了说明整数余数和浮点余数是相同的。唯一的区别是一个返回一个int,另一个返回一个double。

Console.WriteLine(5.0 % 4.0);    // output: 1.0

arithmetic overflow and divide by zero

  

整数算术溢出

     

整数除以零总是抛出DivideByZeroException

     

在整数算术溢出的情况下,可以检查还是不检查溢出检查上下文来控制结果:

     
      
  • 在检查的上下文中,如果常量表达式中发生溢出,则会发生编译时错误。否则,在运行时执行该操作时,将抛出OverflowException
  •   
  • 在未检查的上下文中,结果将被舍弃,方法是丢弃任何不适合目标类型的高阶位。   连同checked和unchecked语句,您可以使用checked和unchecked运算符来控制溢出检查上下文,在该上下文中对表达式进行求值:
  •   
int a = int.MaxValue;
int b = 3;

Console.WriteLine(unchecked(a + b));  // output: -2147483646
try
{
    int d = checked(a + b);
}
catch(OverflowException)
{
    Console.WriteLine($"Overflow occured when adding {a} to {b}.");
}
  

浮点算术溢出

     

使用floatdouble类型的算术运算永远不会引发异常。这些类型的算术运算结果可以是表示无穷且不是数字的特殊值之一:

double a = 1.0 / 0.0;
Console.WriteLine(a);                    // output: Infinity
Console.WriteLine(double.IsInfinity(a)); // output: True

Console.WriteLine(double.MaxValue + double.MaxValue); // output: Infinity

double b = 0.0 / 0.0;
Console.WriteLine(b);                // output: NaN
Console.WriteLine(double.IsNaN(b));  // output: True

基本上,int会抛出溢出异常,具体取决于您是否检查溢出,并且总是抛出被零除的异常。浮点值不会溢出,而是采用特殊的无穷大值,或者在某些情况下不是数字(NaN)

几乎每种编程语言都存在这些差异,但是具体处理方式可能有所不同。