nach oben

xprecround()round2()_round()_round2()
0.01520.020.020.020.02
1.01521.021.011.021.02
2.01522.022.022.022.02
3.01523.023.023.023.02
4.01524.024.014.024.02
5.01525.025.015.025.02
6.01526.026.026.026.02
7.01527.027.027.027.02
8.01528.028.028.028.02
9.01529.029.029.029.02
10.015210.0210.0210.0210.02
1.01521.021.011.021.02
10.15110.210.110.210.2
101.50102101102102
1015-11020102010201020
10150-210200101001020010200
101500-3102000101000102000102000
1015000-41020000102000010200001020000
10150000-510200000101000001020000010200000
101500000-6102000000101000000102000000102000000
1015000000-71020000000101000000010200000001020000000
10150000000-810200000000101000000001020000000010200000000
10150-210200102001020010200
10150-210200101001020010200
1000000.501000000100000010000011000001
-1000000.50-1000000-1000000-1000001-1000001
PHP-Version: 8.1.27

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.