Because that's what it is? Why would you expect 1? You're not asking to round anything. Try it with 20 for the 3rd arg and you get 0.99999999999999999200.
The actual result of your multiplication is 0.999999999999999992000000000000...... and so on. If you ask for only 2 decimals you get 0.99. The real question is why you get 1 when you use echo 2.54 * 0.3937007874015748;. PHP uses the IEEE 754 double precision format for floats, which can compute with a precision of just under 16 digits. Your computation requires a precision of 17 digits, one digit more than the format provides, so the result is rounded.
It isn't explicitly mentioned in the manual (not at least in bcmul() page) but the $scale parameter is just the number of decimals to process. It doesn't imply there's a rounding feature implemented around it: 3v4l.org/1j6FH#v8.3.9
0.99999999999999999200.echo 2.54 * 0.3937007874015748;. PHP uses the IEEE 754 double precision format for floats, which can compute with a precision of just under 16 digits. Your computation requires a precision of 17 digits, one digit more than the format provides, so the result is rounded.bcmul()page) but the$scaleparameter is just the number of decimals to process. It doesn't imply there's a rounding feature implemented around it: 3v4l.org/1j6FH#v8.3.9