Dans PHP, les opérations de soustraction conventionnelles sont mises en œuvre par des symboles de soustraction ( - ). Bien que cette opération puisse répondre aux besoins dans la plupart des scénarios, dans les calculs financiers, il peut conduire à des résultats inexacts en raison de la précision des opérations du nombre de points flottants.
Le flotteur est une façon dont les ordinateurs utilisent pour représenter les décimales. Étant donné que les ordinateurs ne peuvent pas représenter avec précision toutes les décimales, les nombres à virgule flottante ont généralement des erreurs d'arrondi. Cela peut entraîner des risques et des pertes plus importants dans le domaine financier, en particulier lorsqu'il implique des transactions de devises et à grande échelle. Par exemple, une simple opération de soustraction 100.05 - 50.02 peut ne pas renvoyer la valeur exacte attendue, mais renvoie un résultat avec une erreur décimale.
Contrairement aux symboles de soustraction ordinaires, la fonction BCSub fournie par PHP (partie de l'extension BCMATH) est spécifiquement utilisée pour gérer les calculs mathématiques de haute précision. Il prend en charge les valeurs de précision arbitraires, ce qui signifie que même si des décimales très longues sont impliquées, les résultats du calcul peuvent maintenir une précision élevée.
La fonction BCSub est utilisée comme:
<span><span><span class="hljs-title function_ invoke__">bcsub</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$left_operand</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$right_operand</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$scale</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>): </span><span><span class="hljs-keyword">string</span></span><span>
</span></span>
$ Left_Operand : est soustrait (un certain nombre de types de chaîne).
$ Right_Operand : moins (un certain nombre de types de chaîne).
$ Scale : Paramètre facultatif pour définir le nombre de décimales du résultat.
Cette fonction prend deux valeurs de type de chaîne en entrée et renvoie un résultat de haute précision de type de chaîne. Étant donné que les nombres de points flottants ne sont pas utilisés, BCSub peut éviter les problèmes de précision causés par les erreurs de point flottantes.
Dans les systèmes financiers, la précision de calcul de l'argent impliqué est particulièrement importante. Même les petites erreurs peuvent s'accumuler dans d'énormes écarts sur de longues périodes ou de grandes transactions. Par exemple, lors de l'exécution de plusieurs déductions de comptes, des conversions de taux de change, des calculs d'intérêt, etc., l'écart de précision affectera directement la précision des résultats du calcul et la situation financière de la société.
L'utilisation de la fonction BCSub peut garantir que chaque opération de soustraction peut atteindre la précision attendue et éviter l'impact des erreurs de fonctionnement à virgule flottante. Par exemple, lors du calcul de la différence entre deux quantités, l'utilisation d'un symbole de soustraction normal peut entraîner les résultats inexacts suivants:
<span><span><span class="hljs-variable">$amount1</span></span><span> = </span><span><span class="hljs-number">100.05</span></span><span>;
</span><span><span class="hljs-variable">$amount2</span></span><span> = </span><span><span class="hljs-number">50.02</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$amount1</span></span><span> - </span><span><span class="hljs-variable">$amount2</span></span><span>; </span><span><span class="hljs-comment">// Peut-être un résultat inexact</span></span><span>
</span></span>
À l'aide de la fonction BCSub , le résultat de calcul sera précis et le nombre de décimales peut être contrôlé:
<span><span><span class="hljs-variable">$amount1</span></span><span> = </span><span><span class="hljs-string">'100.05'</span></span><span>;
</span><span><span class="hljs-variable">$amount2</span></span><span> = </span><span><span class="hljs-string">'50.02'</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">bcsub</span></span><span>(</span><span><span class="hljs-variable">$amount1</span></span><span>, </span><span><span class="hljs-variable">$amount2</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>); </span><span><span class="hljs-comment">// Précis à deux décimales,Le résultat est '50.03'</span></span><span>
</span></span>
De cette façon, le système financier peut garantir des résultats de calcul de haute précision et éviter les pertes financières causées par des erreurs.
Bien que BCSub fonctionne bien lorsqu'il s'agit de grandes valeurs de précision, il a également certaines frais généraux de performance. Étant donné que chaque calcul nécessite de traitement des chaînes et d'effectuer des opérations de haute précision, BCSub peut être légèrement plus lent que d'utiliser des symboles de soustraction directement à l'aide de nombres de points flottants. Cependant, cette différence de performance n'est souvent pas significative dans les systèmes financiers, en particulier lorsque le système se concentre principalement sur la précision plutôt que sur l'optimisation des performances extrêmes. De plus, sur la plupart des serveurs modernes, l'efficacité d'exécution de la bibliothèque BCMATH est déjà suffisamment élevée pour répondre aux besoins de la plupart des systèmes financiers.
En plus des opérations simples d'addition et de soustraction , la fonction BCSub est également largement utilisée dans d'autres scénarios du système financier, tels que le calcul des intérêts, le calcul des épisodes, la conversion des taux de change, etc.
Par exemple, lors du calcul des intérêts, en supposant que le principal est de 1 000 yuans et le taux d'intérêt annuel est de 5%, l'intérêt après un an est requis:
<span><span><span class="hljs-variable">$principal</span></span><span> = </span><span><span class="hljs-string">'1000'</span></span><span>;
</span><span><span class="hljs-variable">$rate</span></span><span> = </span><span><span class="hljs-string">'0.05'</span></span><span>;
</span><span><span class="hljs-variable">$interest</span></span><span> = </span><span><span class="hljs-title function_ invoke__">bcsub</span></span><span>(</span><span><span class="hljs-variable">$principal</span></span><span>, </span><span><span class="hljs-title function_ invoke__">bcmul</span></span><span>(</span><span><span class="hljs-variable">$principal</span></span><span>, </span><span><span class="hljs-variable">$rate</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>), </span><span><span class="hljs-number">2</span></span><span>);
</span></span>
Dans ce cas, BCMUL et BCSub sont utilisés en combinaison pour éviter l'impact des erreurs flottantes et assurer la précision des calculs d'intérêt.