In der sBasket.php gibt es die Funktion „sGetAmount“, die meiner Meinung nach nur die Summe aller Warenkorbpositionen bilden soll. Das SQL-Statement lautet SELECT SUM(quantity\*(floor(price \* 100 + .55)/100)) AS totalAmount FROM s\_order\_basket WHERE sessionID=? GROUP BY sessionID
Ich frage mich hier was das .55 für einen Zweck hat?
Ich glaube, damit das FLOOR() auch bei negativen Werten (zb Rabatten) immer den korrekten Wert liefern: [quote] mysql> SELECT FLOOR(1.23); -> 1 mysql> SELECT FLOOR(-1.23); -> -2 [/quote] Gruß
Interessante Frage! Zusetzlich zu den negativen Werten glaube ich aber auch, dass der Grund ist, dass ROUND() nicht verwendet werden sollte. Alternativ könnte man das Statement ja auch so schreiben: SELECT SUM(1\*(floor(1.25 \* 100 + .55)/100)) AS price1, SUM(1\*(round(1.25))) AS price2
price1 und price2 sind gleich. Allerdings: SELECT SUM(2\*(floor(25E-1 \* 100 + .55)/100)) AS price1, SUM(2\*(round(25E-1))) AS price2
price1 = 5.0000 price2 = 4 Wie kann das sein? Aus dem Mysql user guide: [quote] ROUND() verwendet für genaue Zahlen die Precision-Math-Bibliothek, wenn das erste Argument ein Dezimalwert ist: Bei genauen Zahlen verwendet ROUND() die gängigen Rundungsregeln: Ein Wert mit einem Wert von 5 oder größer nach dem Komma wird auf den nächsten Integer aufgerundet bzw. (bei negativen Werten) abgerundet. (Anders gesagt: Die Rundung erfolgt von Null weg.) Ein Wert mit einem Wert von weniger als 5 nach dem Komma wird auf den nächsten Integer abgerundet bzw. (bei negativen Werten) aufgerundet. Bei Näherungswerten hängt das Ergebnis von der C-Bibliothek ab. Auf vielen Systemen bedeutet dies, dass ROUND() die Regel „auf nächste gerade Zahl aufrunden“ einsetzt: Ein Wert mit Nachkommastellen wird auf den nächsten geraden Integer gerundet. [/quote] Die Verwendung von FLOOR ist also in diesem Fall ein Workaround. Sauberer wäre es, wenn man den price Wert in der DB als DECIMAL speichert. Dann kann man ohne Probleme auch ROUND verwenden und benötigt keinen Hack. Pfui Shopware!
Ich habe die Preisausgabe im Shop auf drei Nachkommastellen umgestellt und bin deswegen an dieser Stelle angekommen, da die Berechnung nicht mehr passte. Das sollte dann tatsächlich bei Gelegenheit mal angepackt werden.