使用Math.Floor而不是显式整数转换有什么好处吗?

时间:2014-12-30 21:39:07

标签: java c# math casting floor

问题非常简单,是否有任何好处或差异?我注意到在C#中函数返回一个没有任何小数位的double,而在java中它保留小数位,但除此之外结果是相同的。

这是我在Java和C#中使用的代码,以及输出:

//Java                                        //C#

double a = 5.5;                               double a = 5.5;
System.out.println(Math.floor(a));            Console.WriteLine(Math.Floor(a));
System.out.println((int)a);                   Console.WriteLine((int)a);

//Output                                      //Output

5.0                                           5
5                                             5

1 个答案:

答案 0 :(得分:17)

,对于否定数字,这种方式相反。

示例(使用Mono的C#交互式shell csharp):

csharp> Math.Floor(-12.0d)
-12
csharp> Math.Floor(-12.5d) 
-13
csharp> (int) -12.5
-12

(同样适用于Java / C#)我猜大多数语言都是如此。

将浮点数转换为整数,是通过丢弃维持整数部分的小数部分来执行的。 -12.5的整数部分是12。因此,如果转换为Math.Ceil,则负数会生成int

此外,正如@Matthew所说,floatdouble可以达到1.023e23 Avogadro常量)之类的数字。仅仅因为 mantisse 不能再代表逗号之后的数字。 的数字无论如何都被视为整数,但不能用int表示。通过执行Math.floor操作,没有任何操作,但仍然保持该值。转换为int可能会导致溢出

示例

csharp> double ac = 1.023e23;
csharp> Math.Floor(ac);
1.023E+23
csharp> (int) ac;
0
  

注意:这可能看起来很遥远,但是语义上存在明显的差异。这种差异往往会导致错误。

此外,无限数字和works differently NaN

System.out.println(Math.floor(Double.POSITIVE_INFINITY)); // Prints Infinity
System.out.println((int)Double.POSITIVE_INFINITY);        // Prints 2147483647
System.out.println(Math.floor(Double.NaN));               // Prints NaN
System.out.println((int)Double.NaN);                      // Prints 0

但我会一直使用它们。铸造让事情变得更加难以理解。向上/向下/向下舍入是演员的某种(副作用)。通过使用Math.Ceil/Floor/Round,您的意思很清楚。

有时,转换为整数确实比首先执行floor / ceil操作更有效。但是,智能编译器有时可以推导变量将始终存储正数,从而自行优化。此外,对于大多数应用程序而言,这将导致不显着的性能损失。