"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 정확한 돈 계산을 위해 PHP의 `php.ini` 정밀도를 신뢰할 수 있습니까?

정확한 돈 계산을 위해 PHP의 `php.ini` 정밀도를 신뢰할 수 있습니까?

2024년 11월 19일에 게시됨
검색:286

 Can I Rely on PHP's `php.ini` Precision for Accurate Money Calculations?

부동 소수점 문제에 대해 PHP php.ini 정밀 해결 방법을 신뢰할 수 있습니까?

소개

부동 소수점 산술은 종종 오해를 받는 복잡한 주제로 현대 컴퓨터 시스템에 널리 퍼져 있습니다. 대부분의 분수에는 정확한 이진 표현이 부족하므로 반올림이 불가피하게 발생합니다. "모든 컴퓨터 과학자가 부동 소수점 연산에 대해 알아야 할 사항"에 설명된 대로 부동 소수점 연산의 미묘한 차이를 이해하는 것이 중요합니다.

질문과 답변


질문 1: 정확한 2자리 계산(예: 돈)을 위해 정밀도 해결 방법을 사용할 수 있습니까?

답변: 아니요, php.ini 정밀도 설정을 사용할 수 없습니다. 계산 중에 정밀도 길이가 증가할 수 있기 때문에 10^6 미만의 숫자에 대해서도 일관된 2자리 정확도를 유지해야 합니다.

질문 2: 정밀도 해결 방법이 실패하는 명확한 예를 제공하세요.

답변: 첫 번째 킬로그램에만 10% 할인이 적용되는 다음 예를 생각해 보세요.

ini_set('precision', 8); // Your precision
$a = 5.88; // Cost of 1kg
$q = 2.49; // User buys 2.49 kg
$b = $a * 0.01; // 10% Discount only on the first kg
echo ($a * $q) - $b;

출력: 14.5824

질문 3: 어떤 php.ini인가요? .precision 값은 2자리 돈 계산에 적합합니까?

답변: PHP 정밀도 설정은 재무 계산이나 부동 소수점 정밀도에 대한 신뢰할 수 있는 기반이 아닙니다. 특수 라이브러리나 메서드를 사용하는 것이 더 좋습니다.

계산 예시

정확도 제한을 설명하기 위해 다양한 예시를 살펴보겠습니다.

$a = 342349.23;
$b = 341765.07;

// Example A: precision = 20
echo $a - $b, PHP_EOL; // 584.15999999997438863
echo floatval(round($a - $b, 2)), PHP_EOL; // 584.15999999999996817 (rounding introduces instability)
echo number_format($a - $b, 2), PHP_EOL; // 584.16
echo bcsub($a, $b, 2), PHP_EOL; // 584.15

// Example B: precision = 14
echo $a - $b, PHP_EOL; // 584.15999999997
echo floatval(round($a - $b, 2)), PHP_EOL; // 584.16
echo number_format($a - $b, 2), PHP_EOL; // 584.16
echo bcsub($a, $b, 2), PHP_EOL; // 584.16

// Example C: precision = 6
echo $a - $b, PHP_EOL; // 584.16
echo floatval(round($a - $b, 2)), PHP_EOL; // 584.16
echo number_format($a - $b, 2), PHP_EOL; // 584.16
echo bcsub($a, $b, 2), PHP_EOL; // 584.00

// Example D: precision = 3
echo $a - $b, PHP_EOL; // 584
echo floatval(round($a - $b, 2)), PHP_EOL; // 584
echo number_format($a - $b, 2), PHP_EOL; // 584.16 (consistent)
echo bcsub($a, $b, 2), PHP_EOL; // 0.00

이 예는 정확한 계산을 위해 PHP 정밀도 설정에 의존하는 데 따른 불일치를 보여줍니다.

결론

신뢰할 수 있는 재무 계산을 위해서는 잊어버리세요 부동 소수점에 대해 설명하고 센트를 사용하거나 일관된 2자리 정확도를 위해 number_format 함수를 고려하십시오.

Update

ini_set('precision', 8);

$a = 0.19;
$b = 0.16;
$c = 0.01;
$d = 0.01;
$e = 0.01;
$f = 0.01;
$g = 0.01;
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3