정확한 두 자리 돈 계산에 대해 PHP의 '정밀도' 해결 방법을 신뢰할 수 있습니까?

Linda Hamilton
풀어 주다: 2024-11-07 06:39:02
원래의
542명이 탐색했습니다.

Is PHP's `precision` Workaround Reliable for Precise 2-Digit Money Calculations?

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

소개

부동 소수점 산술에는 분수를 이진수로 나타내는 것이 포함됩니다 정확한 표현이 없을 수 있는 분수. 이로 인해 반올림 오류가 발생할 수 있습니다.

질문 1:

이 해결 방법을 사용하면 돈에 대한 정확한 두 자리 숫자 계산이 보장됩니까?

답변 1:

아니요. 계산 중에 정밀도가 높아질 수 있으므로 PHP 정밀도 설정은 정확한 2자리 계산을 보장할 수 없습니다.

질문 2:

해결 방법이 실패하는 경우의 예:

ini_set('precision', 8);
$a = 5.88; // cost of 1kg
$q = 2.49; // User buys 2.49 kg
$b = $a * 0.01; // 10% Discount only on first kg
echo ($a * $q) - $b; // result: 14.5824 (not precise for money calculations)
로그인 후 복사

질문 3:

2자리 돈 계산에 가장 적합한 php.ini.precision 값은 무엇입니까?

답변 3:

PHP 정밀도는 정확한 재무 계산을 위한 권장 측정항목은 아닙니다.

간단한 테스트

bcmath, number_format 및 뺄셈 사용:

$a = 342349.23;
$b = 341765.07;

ini_set('precision', 20);
echo $a - $b, PHP_EOL; // 584.15999999997438863
echo floatval(round($a - $b, 2)), PHP_EOL; // 584.15999999999996817 (rounding issue)
echo number_format($a - $b, 2), PHP_EOL; // 584.16
echo bcsub($a, $b, 2), PHP_EOL; // 584.15 (precision set to 20)

ini_set('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 (precision set to 14)

ini_set('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 (precision set to 6)

ini_set('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
echo bcsub($a, $b, 2), PHP_EOL; // 0.00 (precision set to 3)
로그인 후 복사

결론

number_format 사용 일관성을 위해 돈 계산을 권장합니다. 센트 단위로 저장하는 것도 옵션입니다.

업데이트

질문 1: 0..999999.99 사이의 숫자에 대한 정밀도 해결 방법이 실패합니까?

답변 1:

예, 조합 수가 많기 때문에 전체 테스트는 실용적이지 않습니다.

예:

$a = 0.19;
$b = 0.16;
...
$h = $a + $b + ...; // Total value: 0.4

$i = $h - $a - $b - ...; // Result: 1.0408341E-17 (expected: 0.00)
로그인 후 복사

질문 2: 정밀한 해결 방법이 실패하는 경우를 어떻게 추정합니까?

답변 2:

수학적 해법이 존재하지만 이는 이 토론의 범위에 포함되지 않습니다.

위 내용은 정확한 두 자리 돈 계산에 대해 PHP의 '정밀도' 해결 방법을 신뢰할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!