티스토리 뷰

대부분 프로그래밍 언어에서는 입력되는 값에 '형식' 을 분류하고 이를 기준으로 프로그램을 작성하게 됩니다. (PHP 에서는 '실수형', '정수형', '문자열', '객체', '배열', '리소스', 'Boolean', 'NULL' 이 있습니다.)

프로그래밍을 하다보면 실수형 값을 소수점 이하 값을 제거하고 표시해야 하는 경우가 생기는데, 이때 '실수형' 값을 연산하거나 형변환 할때 아주 작은 값이 손실되서 정확한 값이 안나오는 문제가 발생합니다.

이러한 문제는 다른 언어에서도 마찬가지 발생되기 때문에 PHP 자체의 결함은 아닌듯 합니다.

아래의 예제를 보시고 직접 해보시면 이해가 쉬우리라 생각합니다.

문제 예:

// CASE 1.
$case1 = 1.2 + 1.4 + 1.4;
echo gettype($case1), ' : ',
    printf("%.13f", $case1), '<br />';
// 결과: double : 4.000000000000015

$int = intval($case1);// 실수형을 정수형으로 변환
echo gettype($int), ' : ',
    printf("%.13f", $int), '<br />';
// 결과: integer : 3.000000000000015

// CASE 2.
$case2 = 75.82 * 100;
echo gettype($case2), ' : ',
    printf("%.13f", $case2), '<br />';
// 결과: double : 7581.999999999999118

해결 방법:

PHP 에서 해결책은 두가지 정도가 있는데, ① GMP(GNU Multiple Precision) 확장 모듈을 사용하는 것과, ② 실수형을 문자열로 변환후 다시 정수형으로 변환 하는 방법이 있습니다.
정밀한 계산을 요구하는 프로그램을 작성하신다면 GMP 모듈을 사용하시기 바랍니다.

GMP 확장 모듈은 리눅스에서는 --with-gmp option 옵션을 주고 컴파일을 해야 하고, 윈도우에서는 php.ini 파일에서 php_gmp.dll 을 포함시키도록 함으로써 사용 가능합니다.

그러나 이건 직접 서버를 설정할 수 있을때이고, 호스팅을 받거나 해서 직접 서버 설정을 변경할 수 없는 경우에는 실수형을 문자열로 변환 후 다시 정수형으로 변환하면 됩니다.

$float = 1.2 + 1.4 + 1.4;
echo gettype($float), ' : ',
    printf("%.13f", intval(strval($float))), '<br />';// 또는 intval("{$float}")



참고 사이트
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함