freezner

[PHP] 소수점 기본 연산 함수

소수점을 표현하는데 있어서는 크게 문제가 없지만 소수점이하 자리를 가진 두 개 이상의 정수를 연산하는 경우 부동소수점이라는 녀석때문에 오차가 생기기 마련입니다. 이름테면 5.1 – 4.0 을 하는 경우 1.1이 아닌 1.09가 나오는 것처럼 심심치않게 이런 경우가 보일겁니다.

예전에도 부동소수점을 자릿수만큼 버림처리해서 보여주는 함수를 만들어 올린적이 있었는데요.
이번에는 두 개의 정수를 +, -, *, / 기본 사칙 연산할 수 있도록 함수를 만들어봤습니다. 기본 원리는 같습니다. 소수점이 존재하는 정수를 자연수로 변환한 후에 연산이 끝나면 초기 소수점 자릿수 만큼 다시 소수로 바꿔주는 함수입니다.

아래 예제는 제가 필요로 하는 기능 위주로 제작된 것이라 불필요하거나 개선해야할 부분도 많을 겁니다. 이 로직은 소수점 둘째자리까지 표현되는 정수의 연산인데요. 달러, 유로의 센트 통화단위 관련해 소수점 둘째자리로 픽스 시킨겁니다.

//소수점 계산 hjpark - 2013-10-17
	function digitMath($value1, $value2, $type = 'plus')
	{
		if(is_numeric($value1) && is_numeric($value2))
		{
			$num1 = $value1 * 100;
			$num2 = $value2 * 100;

			$digits = 2;

			$base = pow(10, $digits);

			$num1 = round($num1 * $base) / $base;
			$num2 = round($num2 * $base) / $base;

			$result1 = floor($num1);
			$result2 = floor($num2);

			switch($type)
			{
				case 'plus' :
					$result = $result1 + $result2;
				break;

				case 'minus' :
					$result = $result1 - $result2;
				break;

				case 'multiply' : 
					$result = $result1 * $result2;
				break;

				case 'divide' : 
					$result = $result1 / $result2;
				break;

				default : 
					$result = $result1 + $result2;
					$str = ' + ';
			}

			$result = $result / 100;

		}else{
			$result = null;
		}

		return $result;
	}

소스를 보시면 아시겠지만 굉장히 단순합니다. 제가 복잡한걸 싫어하기 때문이기도 하고 코드는 최대한 단순하게 작성해야한다고 생각하기 때문에 ^^;

이 부동소수점의 연산문제는 PHP뿐만 아니라 다른 언어에서도 같은 이슈가 존재합니다. 컴퓨터는 모든 숫자를 2진법으로 변환해 계산하기 때문인데요. Javascript 버전도 올려드리겠습니다.

Exit mobile version