php
PHP - 고정밀도 계산 함수
아래 코드를 실행해 보면 우리가 원하는 결과가 아닌 다른 값을 반환받게 됩니다.
위 코드 결과로 원하는 값은 10000000000000000001 이나 결과는 1.0E+19 가 나왔습니다.
num1 과 num2 를 더한 결과 값을 문자열로 반환하는 함수입니다.
scale 는 소수점 이하 몇 자리까지 계산할 것인지를 지정할 수 있고, 생략할 경우 소수점은 제거됩니다.
num1 에서 num2 를 뺀 결과 값을 문자열로 반환하는 함수입니다.
scale 파라미터는 소수점 이하 몇 자리까지 계산할 것인지를 지정할 수 있고, 생략할 경우 소수점은 제거됩니다.
num1 와 num2 를 곱한 값을 문자열로 반환하는 함수입니다.
scale 파라미터는 소수점 이하 몇 자리까지 계산할 것인지를 지정할 수 있고, 생략할 경우 소수점은 제거됩니다.
num1 를 num2 로 나눈 값을 문자열로 반환하는 함수입니다.
scale 파라미터는 소수점 이하 몇 자리까지 계산할 것인지를 지정할 수 있고, 생략할 경우 소수점은 제거됩니다.
num 를 modulus 로 나눈 후 나머지 값을 문자열로 반환하는 함수입니다.
operand의 값의 제곱근 값을 반환하며, scale은 소수점 아래 몇 번째 자리까지 계산할 것인지를 지정합니다.
<?php
$num = 9999999999999999999;
echo $num+2; // 1.0E+19
?>
이러한 결과가 나온 이유는 PHP에서 숫자 표기의 한계를 19자리까지로 제한했기 때문입니다. 물론 PHP 버전 차이에 따라 표현할 수 있는 범위도 달라지겠지만 어찌되었든 PHP는 자동으로 결과를 부동소수점 형식인 1.0E+19로 변경시킨 결과 값을 반환하였습니다.
위와 같은 문제를 해결하기 위해 PHP에서는 큰 숫자를 이용하여 계산할 수 있는 함수를 제공합니다.
bcadd() 는 두 숫자를 더한 값을 반환하는 함수이고, bcsub() 는 두 숫자를 뺀 값을 반환합니다. bcmul() 는 두 값을 곱한 값을 반환하고, bcdiv() 함수는 나눈 값을 반환합니다. 마지막으로 bcsqrt() 함수는 제곱근 값을 반환합니다.
이 함수들은 파라미터로 문자열을 사용해야 원하는 결과 값을 얻을 수 있습니다.
bcadd() 함수는 숫자를 문자열 형식으로 표현하기 때문에 큰 숫자를 사용할 수 있고, 고정밀도를 가진 계산을 할 수 있습니다.
아래 코드를 위와 같은 일을 하지만 + 연산자 대신에 bcadd() 를 사용하여 고정밀도 숫자를 표현할 수 있습니다.
<?php
$num = "9999999999999999999";
echo bcadd($num, 2); // 10000000000000000001
?>
bcadd() 함수
bcadd(string num1, string num2 [, int scale]);
<?php
$a = '1.234';
$b = '5';
echo bcadd($a, $b); // 6
echo bcadd($a, $b, 4); // 6.2340
?>
bcsub() 함수
bcsub(string num1, string num2 [, int scale]);
<?php
$a = '1.234';
$b = '5';
echo bcsub($a, $b); // -3
echo bcsub($a, $b, 4); // -3.7660
?>
bcmul() 함수
bcmul(string num1, string num2 [, int scale]);
<?php
$a = '1.234';
$b = '5';
echo bcmul($a, $b); // 6
echo bcmul($a, $b, 4); // 6.170
?>
bcdiv() 함수
bcdiv(string num1, string num2 [, int scale]);
<?php
$a = '1.234';
$b = '5';
echo bcdiv($a, $b); // 0
echo bcdiv($a, $b, 4); // 0.2468
?>
bcmod() 함수
bcmod(string num, string modulus);
<?php
$a = '1.234';
$b = '5';
echo bcmod($a, $b); // 1
?>
bcsqrt() 함수
bcsqrt(string operand [, int scale);
<?php
$a = '1.234';
echo bcsqrt($a, 10); // 1.1108555261
echo bcsqrt($a, 20); // 1.11085552615990527825
?>
0 댓글