2014-12-30 2 views
6

질문은 매우 간단합니다. 이점이나 차이점이 있습니까? C#에서 함수가 소수 자리가없는 이중을 반환한다는 것을 알았습니다. 반면 Java에서는 소수 자리를 유지하지만 결과는 동일합니다. 여기 명시 적 정수 캐스팅보다 Math.Floor를 사용하면 어떤 이점이 있습니까?

내가 자바와 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 
+2

자바는 모든 플로트에'.0'을 출력합니다. –

+0

당신은 system.out의 출력을 기반으로'java it가 유지된다 '는 가정을하고 있습니까? –

+2

'Math.Floor'는 소수 부분없이 double을 반환합니다. 그것은 정수로 캐스팅하는 것과 같지 않습니다. –

답변

14

부정적인 번호를이 반대 방식으로 작동합니다.

(모노의 C#을 대화 형 쉘 csharp 사용) :

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

(자바/C#을 모두 동일) 및 어쨌든 대부분의 언어를 생각한다.

캐스팅 부동 소수점 숫자를 정수로 변환하는 것은 정수 부분을 유지하는 소수 부분을 버림으로써 수행됩니다. -12.5의 정수 부분은 12입니다. 따라서 음수는 int으로 변환하면 Math.Ceil이됩니다. @Matthew 주장 또한 같은

하는 float 또는 double1.023e23 ( 아보가드로 정수) 같은 수치에 도달 할 수있다. 단순히 mantisse이 쉼표 뒤에 더 이상 숫자를 나타낼 수 없기 때문입니다. 의 숫자는이며 정수로 간주되지만 int으로 표시 할 수 없습니다. Math.floor 작업을 수행하면 아무 일도 일어나지 않지만 값은 계속 유지됩니다.

:

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

주 : int로 변환 오버 플로우이 발생할 수 있지만이 지금까지 가져온 보일 수도 있지만, 그럼에도 불구하고 의미에서 명확한 차이가 이렇게있다. 어쨌든 오류로 이어지는 경향이있는 차이.

또한, 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을 사용하면 무엇을 의미하는지 명확히 알 수 있습니다.

때때로 float/ceil 연산을 수행하는 것보다 정수로 변환하는 것이 훨씬 효율적입니다. 그러나 똑똑한 컴파일러는 변수가 항상 양수를 저장하므로 최적화 될 수 있음을 알 수 있습니다. 또한 대부분의 응용 프로그램에서는 성능상의 불이익을 거의 미치지 않습니다.