본문 바로가기

PHP

PHP 부동소수점 오류

컴퓨터가 소수점을 표현하는 방식에는 고정 소수점 방식과 부동 소수점 방식이 있습니다.
고정 소수점 방식은 소수점이 항상 고정된 위치에 있다는 의미로 정수를 표현할 때 주로 사용 되어 지고, 부동 소수점 방식은 소수점의 위치가 바뀌기 때문에 실수를 표현할 때 주로 사용하여 고정 소수점 방식보다 넓은 범위의 수를 표현할 수 있습니다.

그런데 컴퓨터는 모든 숫자를 2진수로 표현 하기때문에 부동 소수점에 약간의 오차 범위가 생깁니다.

이 오차 범위때문에 부동 소수점 연산 처리를 할때 어쩔 수 없는 오류가 발생합니다.


아래는 그 오류가 발생 하는 예시 코드와 코드에 대한 결과입니다.



위에 어처구니 없는 결과를 볼 수 있습니다. 2.3 * 100이 229입니다!! 

floor 함수는 소수점 이하를 무조건 버리는 함수입니다.  floor함수를 쓰지않은 상태에서 2.3 * 100의 결과는 229.999999999997입니다. 그런데 이건 위에 설명한거처럼 컴퓨터가 모든 수의 표현과 연산을 2진수로 처리하기때문에 발생하는 어쩔 수 없는 오류 입니다. 그렇기때문에 사실 php뿐만 아니라 거의 모든언어에서 발생하는 오류 입니다.


그렇다면 이 오류를 해결 할 방안에 대해서 알아보겠습니다.


1. DB에서 연산을 연산을 하면 정확한 결과값을 얻을 수 있습니다

ex) select 83.33 - 1 + 2 -10.33  => 74.00
DB에 오류가 발생하는 실수형 숫자를 String형으로 전달하고 DB에서 double형이나 float형으로 형변환하여 연산 처리 할 수 있습니다.


2. PHP 정밀 연산 함수를 이용하면 원하는 결과값을 정확하게 계산 가능합니다. 아래 링크를 참고 해주세요

.http://kr.php.net/manual/kr/ref.bc.php


- by Hong -