본문 바로가기

Programming/Doodle

(java) 파일크기(byte)를 KMGT..로 표현하는 계산식



public String size2String() {
Integer unit = 1024;
if (filesize < unit){
return String.format("(%d B)", filesize);
}
int exp = (int) (Math.log(filesize) / Math.log(unit));

return String.format("(%.0f %s)", filesize / Math.pow(unit, exp), "KMGTPE".charAt(exp-1));
}

<String.format 에서>
%s 문자열
%d 정수
%x 16진수
%o 8진수
%f 실수

(%d B) 는 정수 B(byte)
(%.0f) 는 소숫점 없는 실수
(%s) 는 문자열

Ex) Math.pow(5, 3) 은 5의 3승 (5의 세제곱)
즉) Math.pow(unit, exp) 는 unit의 exp 승

charAt(인수) : 인수번째 문자를 읽어낸다
Ex) "abcde".charAt(2)에는 'c'가 읽어 진다
0부터 시작하기 때문에 3번째인 'c'가 읽어 진다

===================================
원리는 로그(log)를 이용한 것으로 밑수가 10인 로그(상용로그)를 실행하면 10의 배수가 계산된다.

byte, K-byte, M-Byte 등은 1024배씩 커지는 것으로 약 10의 3배수씩 커진다고 보면 된다.

즉, 1 K byte = 1024 byte 이고 1024 byte 는 Log를 취하면 약 3(3.010)의 값이 나온다.

이 3은 10의 자릿수로 보면 된다 (1000으로 보면 0의 개수).

예로, 파일 크기(filesize)가 2248 byte일 경우 로그를 취하면 약 3(3.351)이 나오고

단위 (1024의 로그값 3)로 나누면 1(1.11)이 계산 된다.

즉, 단위를 나타내는 문자열("KMGTPE")에서 첫 번째 K가 선택되게 된다.

단위를 구했으면 단위에 맞게끔 파일 크기를 계산해 줘야 한다.

단위값(1024)을 거듭제곱(power)으로 1을 계산하면 1024가 나오고 이 값을 실제 파일 크기 2248에 대하여 나누면 2.19가 계산된다.

따라서 최종적으로 2.2 K byte로 표기되는 것이다.


Info from. ​forest71.tistory.com