php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 27.09.2007, 11:50  
Benutzer
 
Registriert seit: 31.03.2005
Beiträge: 80
Anotherone
Standard Kann mir jemand dieses Phänomen erklären? Wert = Wert-1???

Ich bin eben per Zufall über etwas gestolpert, das ich mir nicht erklären kann. Ich möchte die Nettopreise passend zur Steuer (19%, 7%) in einem Array sammeln. Nur leider ist plötzlich 19 = 18, wie kann das sein?

$products_tax stammt aus der Datenbank und wird von einer Funktion übergeben. Wert 19, Typ Float
$result['products_price'] = Wert 100, Typ Float
$tqty = Wert 1, Typ String


PHP-Code:
var_dump($products_tax);
$this->amounts[$products_tax] += $result['products_price'] * $qty;
var_dump($products_tax); 
var_dump($this->amounts); 
Das ergibt folgende Ausgabe:

Code:
float 19

float 19

array
  18 => float 100
Ändere ich den oberen Code folgendermaßen ab:

PHP-Code:
var_dump((int)$products_tax);
$this->amounts[(string)$products_tax] += $gv_result['products_price'] * (int)$qty;
var_dump($products_tax); var_dump($this->amounts); 
dann stimmt das Ergebnis (und der explizite Cast nach int zeigt, was passiert):

Code:
int 18

float 19

array
  19 => float 100
Das Float nicht 100% präzise ist, wusste ich. Aber warum wird es nach außen als 19 dargestellt, intern wohl aber als 18,999999... behandelt und somit auf 18 gecastet? Finde nur ich das inkonsequent oder hab ich da was falsch verstanden? Vermutlich sollte man keine Floatzahlen als Array-Index verwenden...
Anotherone ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 27.09.2007, 12:27  
CIX88
Gast
 
Beiträge: n/a
Standard

Hmmm warum benutzt du bei 'products_price' nicht DOUBLE ?
  Mit Zitat antworten
Alt 27.09.2007, 13:12  
Erfahrener Benutzer
 
Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse:
Fortgeschritten
brian johnson befindet sich auf einem aufstrebenden Ast
Standard

die gute alte FLOAT unpräzision. es steht groß genug im manual:

nimm bcmul() und co.

PHP-Code:
var_dump($products_tax); 
$this->amounts[$products_tax]=bcadd($this->amounts[$products_tax],bcmul($result['products_price'],$qty)); 
var_dump($products_tax); 
var_dump($this->amounts); 
brian johnson ist offline   Mit Zitat antworten
Alt 27.09.2007, 13:21  
Benutzer
 
Registriert seit: 31.03.2005
Beiträge: 80
Anotherone
Standard

@cix88 Das gibt das System vor, genauso wie beim Steuersatz. Ich müsste also explizit casten. Normalerweise wären bei 4 internen Nachkommastellen doch auch float ok, oder nicht?

@brian Das mag ja sein, hat aber nichts mit meinem Problem zu tun. Es geht nicht um den Preis, sondern um die falsche Umsetzung einer Floatzahl als Arrayindex. Und ich finde es schon erwähnenswert, das (string)19 nicht das gleiche ist wie (int)19, wenn 19 eine float-Zahl ist. Und nochmal: float habe ich nicht ausgewählt, das gibt PHP vor.
Anotherone ist offline   Mit Zitat antworten
Alt 27.09.2007, 14:30  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Sorry aber einen Float-Wert als Array-Key zu verwenden ist auch dämlich. Die ganze Geschichte mit katastrophalen aber vorhersehbaren Rundungsfehlern bei Fließkommazahlen ist doch nichts neues. Übrigens auch nicht bei nur bei PHP.
Du findest das gleiche Problem sicher auch, wenn du im Archiv von vor 5 Jahren stöberst.
Zergling-new ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
nach grösstem (unbekannten) Wert suchen lindner Datenbanken 2 20.08.2006 22:13
array verarbeitung (schlag auf den hinterkopf) PHP Tipps 2007 9 16.11.2005 11:37
kleinsten und größten wert ermitteln niffi PHP Tipps 2005 14 26.04.2005 12:42
[Erledigt] Problem: per klick auf Button Wert erhöhen/verringern HTML, Usability und Barrierefreiheit 7 07.10.2004 08:31

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
kann mir jemand gleitkommazahlen erklären, $wert = $wert << 1 php, wer kann mir arrays erklären?

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:30 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.