Sprintf 함수를 사용하여 부동 소수점 번호를 형식화 할 때 정밀 문제가 발생할 수 있습니다. 이러한 문제는 일반적으로 부동 소수점 수를 이진수로 정확하게 표현할 수 없을 때 발생합니다. 특히 특정 소수점 값의 경우 Sprintf는 부정확 한 결과를 출력 할 수 있습니다. 이 기사에서는이 문제가 발생하는 이유와 해결 방법을 살펴 봅니다.
PHP 의 부동 소수점 번호는 IEEE 754 표준을 사용하여 표현되며, 이는 바이너리 플로팅 포인트 번호 표현입니다. 이 표준은 많은 일반적인 숫자 값을 나타낼 수 있지만 컴퓨터는 이진을 사용하여 데이터를 내부적으로 저장하기 때문에 일부 소수점 소수점 숫자 (예 : 0.1)는 이진수로 정확하게 표현할 수 없습니다. 따라서 이러한 부동 소수점 번호를 계산하거나 형식화 할 때 오류가 발생할 수 있습니다.
예를 들어, 부동 소수점 번호 0.1은 이진에서 정확하게 표현할 수 없으며, 근사치는 저장시 약간의 오류가 발생합니다. 이 오류는 출력 할 때, 특히 Sprintf 와 포맷 할 때 더 명확해질 수 있습니다.
<?php
$number = 0.1 + 0.2;
echo sprintf("%.1f", $number);
?>
이 코드에는 0.3 출력이 있어야하지만 0.300000000000000000000000004 와 같은 0.3 이외의 결과를 얻을 수 있습니다. 이 현상은 계산 중에 부동 소수점 수의 약간의 오류로 인해 발생하여 서식 중에 부정확 한 값이 발생합니다.
Sprintf를 사용할 때 정확도 문제를 피하기 위해 다음 방법을 수행 할 수 있습니다.
가장 쉬운 솔루션은 원형 기능을 사용하여 부동 소수점 번호의 정확도를 제어하는 것입니다. 둥근 함수는 소수점 이후에 유지 된 자릿수 수를 지정하여 불필요한 정확도 문제를 피할 수 있습니다.
<?php
$number = 0.1 + 0.2;
echo sprintf("%.1f", round($number, 1));
?>
이 예에서, 라운드 ($ 숫자, 1)는 소수점 후 플로팅 포인트 번호를 1로 반올림하여 Sprintf가 정확한 결과를 출력하도록합니다.
Number_Format 함수는 소수점 이하 자리의 수를 지정할뿐만 아니라 천분의 분리기와 같은 문제를 다루는 숫자를 형식화하는 또 다른 좋은 방법입니다. 숫자 _format을 사용하면 떠 다니는 정확도 문제를 피할 수 있습니다.
<?php
$number = 0.1 + 0.2;
echo number_format($number, 1);
?>
이 예제는 Sprintf 의 정확도를 피하며 형식의 부동산 지점 번호를 직접 출력합니다.
경우에 따라 부동 소수점 번호 자체의 정확도를 제어하여 오류를 피할 수 있습니다. 예를 들어, 추가, 곱셈 및 기타 작업을 수행 할 때 미리 정확도를 미리 설정하고 BCADD 및 BCMUL 과 같은 기능을 사용하여 고정밀 계산을 수행하여 부동 소수점 숫자의 부정확 한 값을 피할 수 있습니다.
<?php
$number = bcadd("0.1", "0.2", 1);
echo sprintf("%.1f", $number);
?>
BCADD를 사용하면 플로팅 포인트 오류를 피하면서 정확한 결과를 얻을 수 있습니다.
정밀 문제는 Sprintf를 사용하여 PHP의 부동 소수점 수를 형식화 할 때 발생합니다. 이 문제를 해결하기 위해 라운드 함수, 숫자 _format 함수 또는 고정밀 계산 함수 (예 : BCADD )를 사용할 수 있습니다. 이러한 방법은 정확도 오차로 인해 부정확 한 출력을 피하고 출력 부동 소수점 번호가 기대치와 일치하도록하는 데 도움이 될 수 있습니다.