2013-04-17 3 views
2

사용자에게 표시 할 파일 크기 문자열을 만드는 메소드가 있습니다. FindBugs는 int가 부동 소수점 형으로 캐스팅 된 다음 Math.round으로 전달되었다고 말합니다.int 값을 float으로 캐스팅 한 다음 Math.round로 전달합니다.

public static String createFileSizeString(long size) 
{ 
    if (size < 1024) 
    { 
     return size + " bytes"; 
    } 
    else if (size < 1048576) 
    { 
     return (Math.round(((size * 10)/1024))/10) + " KB"; 
    } 
    else 
    { 
     return (Math.round(((size * 10)/1048576))/10) + " MB"; 
    } 
} 

FindBugs는 말을 계속 :. "는 float로 정수를 변환하는 것은 더 소수 부분이있는 번호를 제공해야하기 때문에이 작업은 항상 아무 조합 없어야 작동에게을 생성하는 것 같다 부동 소수점 연산을 사용하여 Math.round에 전달할 값을 지정하려고했습니다. "

어떻게 작동하지 않습니까? (size * 10)/1024에 캐스트를 추가해야 ((float)size * 10)/1024이 대신 표시되어야하나요?

답변

1

코드

((size * 10)/1024) 

는 정수이며 전체를 둥글게 경우는 같은 번호마다 시간을 얻어야한다. 의도 아마도 어떤

return size * 10/1024/10.0 + " KB"; 

또는 라운드 반까지를 내림하는 것이 었습니다.

return (size * 10 + 512)/1024/10.0 + " KB"; 

또는 Math.round

return Math.round(size/102.4)/10.0 + " KB"; 

사용하여 거의 같은 일이 소수점 한자리 당신에게 수 KB를 제공 할 것입니다.

관련 문제