2013-02-04 5 views
0

다음은 float 값의 정밀도와 관련이 있다고 생각합니다. 그러나 어떻게 정확하게 왜 따르는 동작이 관찰되는지 확실하지 않습니다. 나는 자바 코드의 조각을 다음 있습니다 :float 및 Java에서 int 값 빼기

class float_int 
{ 
    void float_to_int(float val) 
    { 
     int int_val = (int)val; 
     float remain_val = val - (float)int_val; 
     System.out.println("val - " + val); 
     System.out.println("int_val - " + (float)int_val); 
     System.out.println("remain_val - " + remain_val); 
    } 

    public static void main(String args[]) 
    { 
     float_int obj = new float_int(); 
     obj.float_to_int((float)12.345); 
    } 
} 

내가 얻을 다음과 같은 출력 :

val - 12.345 
int_val - 12.0 
remain_val - 0.34500027 

지금 내가 remain_val의 말에 "27"추가납니다 이유를 모르겠어요 .

+0

내가 사용하는 것이 좋습니다를'더블 '당신이 아주 좋은 * 이유가 없다면. 당신은 여전히이 이슈들을 볼 수있을 것이지만 그것들은 약 10 억 배 더 작을 것입니다. –

답변

3

12.3450.345도 정확하게 2 진 부동 소수점으로 표현할 수 없습니다.

For example : 위의 코드에서

float f = 12.345f; 
System.out.printf("%.15f\n", f); // Displays 12.345000267028809 

, 12.345000267028809는 정확하게 표현할 수 것을 가장 가까운 값이다.

+0

"27"또는 왜 무작위일까요? – pkumar

+0

@pkumar ..'0.345'를'base 2'로 변환하려고하면 알게 될 것입니다. 펜과 종이를 꺼내는 시간. 어떤 낯선 사람도 믿지 마세요. –

+0

@pkumar. 그리고 일단 base 2로 성공적으로 변환되면, SO에'floating-point' 태그 위키를 지나갈 때가 왔습니다. –

3

정확합니다. 수위가 정확하지 않기 때문입니다.

당신이 당신의 플로트를 원하는 경우

가 제대로 표현하기 위해, 당신은이 사람이 걸릴 듯하는 것과 같은 방법을 사용할 수 있습니다 http://floating-point-gui.de/languages/java/ 플로트 반올림하는 것입니다

:

String.format("%.2f", 1.2399) // returns "1.24" 
String.format("%.3f", 1.2399) // returns "1.240" 
String.format("%.2f", 1.2) // returns "1.20" 
+0

"정확한"정의에 따라 다름 ... –