bc is the abbreviation of Binary Calculator. The parameters of the bc* function are all operands plus an optional [int scale], such as string bcadd(string $left_operand, string $right_operand[, int $scale]). If scale is not provided, the default of bcscale is used. value. Here, large numbers are directly represented by a string consisting of 0-9, and the calculation result is also a string.
bcadd — Add two high-precision numbers
bccomp — Compares two high-precision numbers, returns -1, 0, 1
bcdiv — divide two high-precision numbers
bcmod — Find the remainder of a high-precision number
bcmul — Multiply two high-precision numbers
bcpow — Power high-precision numbers
bcpowmod — Find high-precision numerical power and modulus, very commonly used in number theory
bcscale — Configure the default number of decimal points, which is equivalent to "scale=" in Linux bc
bcsqrt — Find the square root of a high-precision number
bcsub — Subtract two high-precision numbers
First look at a piece of code:
<?php $a = 0.1; $b = 0.7; var_dump(($a + $b) == 0.8);
The printed value is actually boolean false
Why is this? The PHP manual has the following warning message for floating point numbers:
Warning
Floating point precision
Apparently simple decimal fractions like 0.1 or 0.7 cannot be converted to the internal binary format without losing a bit of precision. This can lead to confusing results: for example, floor((0.1 0.7)*10) will usually return 7 instead of the expected 8, because the internal representation of the result is something like 7.9999999999... .
This has to do with the fact that it is impossible to express certain decimal fractions exactly with a finite number of digits. For example, 1/3 in decimal becomes 0.3333333. . .
So never trust that a floating-point number result is accurate to the last digit, and never compare two floating-point numbers for equality. If you really need higher precision, you should use arbitrary precision math functions or the gmp function
Then we should rewrite the above equation as
<?php $a = 0.1; $b = 0.7; var_dump(bcadd($a,$b,2) == 0.8);
This can solve the calculation problem of floating point numbers