x | prec | round() | round2() | _round() | _round2() |
---|---|---|---|---|---|
0.015 | 2 | 0.02 | 0.02 | 0.02 | 0.02 |
1.015 | 2 | 1.02 | 1.01 | 1.02 | 1.02 |
2.015 | 2 | 2.02 | 2.02 | 2.02 | 2.02 |
3.015 | 2 | 3.02 | 3.02 | 3.02 | 3.02 |
4.015 | 2 | 4.02 | 4.01 | 4.02 | 4.02 |
5.015 | 2 | 5.02 | 5.01 | 5.02 | 5.02 |
6.015 | 2 | 6.02 | 6.02 | 6.02 | 6.02 |
7.015 | 2 | 7.02 | 7.02 | 7.02 | 7.02 |
8.015 | 2 | 8.02 | 8.02 | 8.02 | 8.02 |
9.015 | 2 | 9.02 | 9.02 | 9.02 | 9.02 |
10.015 | 2 | 10.02 | 10.02 | 10.02 | 10.02 |
1.015 | 2 | 1.02 | 1.01 | 1.02 | 1.02 |
10.15 | 1 | 10.2 | 10.1 | 10.2 | 10.2 |
101.5 | 0 | 102 | 101 | 102 | 102 |
1015 | -1 | 1020 | 1020 | 1020 | 1020 |
10150 | -2 | 10200 | 10100 | 10200 | 10200 |
101500 | -3 | 102000 | 101000 | 102000 | 102000 |
1015000 | -4 | 1020000 | 1020000 | 1020000 | 1020000 |
10150000 | -5 | 10200000 | 10100000 | 10200000 | 10200000 |
101500000 | -6 | 102000000 | 101000000 | 102000000 | 102000000 |
1015000000 | -7 | 1020000000 | 1010000000 | 1020000000 | 1020000000 |
10150000000 | -8 | 10200000000 | 10100000000 | 10200000000 | 10200000000 |
10150 | -2 | 10200 | 10200 | 10200 | 10200 |
10150 | -2 | 10200 | 10100 | 10200 | 10200 |
1000000.5 | 0 | 1000000 | 1000000 | 1000001 | 1000001 |
-1000000.5 | 0 | -1000000 | -1000000 | -1000001 | -1000001 |
Fazit: PHP rundet falsch. Mal wird auf, mal abgerundet. Wahrscheinlich stolpert die Implementierung über das Problem der binären Darstellung von dezimalen Nachkommastellen. Würde PHP kaufmännisch runden, müsste immer 0.02 herauskommen, mathematisch immer 0.01 . Intendiert ist bei PHP das kaufmännische Runden, denn 'echte' ganze Zahlen werden immer korrekt kaufmännisch gerundet. Dabei ist mit 'echt' gemeint, dass die Zahl nicht nur wie eine ganze Zahl dargestellt wird, sondern tatsächlich nicht durch einen kleinen nicht darstellbaren Betrag von der Darstellung abweicht (wie 10150 aus 1.015*pow(10,4)!===10150).
Der Fehler tritt unter Windows und UNIX auf, zwischen 4.3.1 und 5.2.0 und kann durch eine selbstgebaute Funktion round2() nachvollzogen werden.