问题非常简单,是否有任何好处或差异?我注意到在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
答案 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所说,float
或double
可以达到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操作更有效。但是,智能编译器有时可以推导变量将始终存储正数,从而自行优化。此外,对于大多数应用程序而言,这将导致不显着的性能损失。