Zauważ, że fmod nie jest równoznaczne z tej podstawowej funkcji:
<?php
function modulo($a, $b) {
return $a - $b * floor($a/$b);
}
?>
ponieważ fmod() zwróci wartość z tego samego znaku jako $ a. Innymi słowy funkcja floor() nie jest poprawna, ponieważ zaokrągla w kierunku -INF zamiast w kierunku zera.
naśladować fmod ($ a, $ b) prawidłowe sposobem jest:
<?php
function fmod($a, $b) {
return $a - $b * (($b < 0) ? ceil($a/$b) : floor($a/$b)));
}
?>
Należy zauważyć, że obie funkcje będą rzucać dzielenie przez zero, jeśli $ b ma wartość null.
Pierwsza funkcja modulo() powyżej jest funkcją matematyczną, która jest przydatna do pracy na cyklicznych struktur (takich jak computions z kalendarza lub trignonometric funkcji:
- fmod($a, 2*PI) returns a value in [0..2*PI) if $a is positive
- fmod($a, 2*PI) returns a value in [-2*PI..0] if $a is negative
- modulo($a, 2*PI) returns a value always in [0..2*PI) independantly of the sign of $a
Może powinieneś podać, w jaki sposób możesz oczekiwać zera? –
edytuj i popraw to, zadałem to pytanie jako referencję –
Akam, co powinno się zdarzyć, gdy napotkane zostanie zero jest specyficzne dla problemu/domeny. Jeśli zamierzasz stworzyć wiki opisujące, co te funkcje robią, idź do niego. –