bcmul
bcmul($num1, $num2, $scale)
Mnoży dwie liczby. Przyjmuje i zwraca je jako ciągi znaków i liczy dokładnie w systemie dziesiętnym. Należy do rozszerzenia BCMath.
Parametry
- $num1, $num2 – mnożone liczby jako ciągi znaków.
- $scale – opcjonalny, liczba miejsc po przecinku w wyniku. Domyślnie wartość z bcscale(), zwykle 0.
Przykłady
echo bcmul("19.90", "3", 2); // 59.70
// cena z 23 % VAT
echo bcmul("1000", "1.23", 2); // 1230.00
// dokładny wynik ma więcej miejsc, niż żądasz
echo bcmul("1.25", "1.23", 4); // 1.5375
// nadmiarowe miejsca po przecinku są obcinane: 0.475 daje 0.47
echo bcmul("2.5", "0.19", 2); // 0.47
// round z liczbą dziesiętną zaokrągla w górę
echo round(2.5 * 0.19, 2); // 0.48
// zaokrąglanie w BCMath: licz z jednym miejscem więcej i dodaj połowę ostatniego miejsca
echo bcadd(bcmul("2.5", "0.19", 3), "0.005", 2); // 0.48
// duże liczby dokładnie
echo bcmul("123456789012345678", "1000"); // 123456789012345678000
Na co uważać
- Miejsca po przecinku ponad podaną liczbę są obcinane, a nie zaokrąglane. Przy cenach daje to różnice w groszach. Dodawanie połowy ostatniego miejsca jak w przykładzie działa tylko dla liczb dodatnich.
- Od PHP 7.3 zwraca wynik zawsze z podaną liczbą miejsc po przecinku, nawet jeśli są to zera (1230.00).
- Parametry przekazuj jako ciągi znaków, także wynik jest ciągiem znaków.
- Ciąg znaków, który nie jest liczbą, oznacza w PHP 7.4 ostrzeżenie i liczy się jako 0, od PHP 8.0 rzuca wyjątek ValueError.
- BCMath to rozszerzenie PHP i nie musi być włączone na serwerze. Sprawdzisz to przez function_exists("bcadd").