php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2009

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 24.02.2009, 20:17  
Neuer Benutzer
 
Registriert seit: 24.02.2009
Beiträge: 5
dav1d befindet sich auf einem aufstrebenden Ast
Standard 12 != 12 ?? Datentypen?

Hi Leute!

Probiert doch mal dieses Script aus:

Code:
<?php

  echo (64.8)/(5.4);
  if (intval(64.8/5.4) == 12) echo ' = 12 !';
  else echo ' != 12 ???';

?>
Bei mir wird "12 != 12 ???" ausgegeben.
Was ist am Code falsch? Liegs irgendwie an den Datentypen?
(mit "(if (intval(( 10*64.8 )/( 10*5.4 )) == 12))" kommt man zum erwarteten Ergebnis)

Interessanterweise ist "floor(64.8/5.4)" = 11
dav1d ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 24.02.2009, 20:27  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.241
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Zitat:
Interessanterweise ist "floor(64.8/5.4)" = 11
Weniger interessant, wenn man das Handbuch liest. floor
Zitat:
floor — Abrunden
PHP-Code:
 var_dump (64.8/5.4);
 
var_dump (intval(64.8/5.4));
 
var_dump (intval(bcdiv (64.8,5.4))); 
Zitat:
float(12)
int(11)
int(12)
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--

Geändert von nikosch (24.02.2009 um 20:30 Uhr).
nikosch ist offline  
Alt 24.02.2009, 20:28  
Neuer Benutzer
 
Registriert seit: 24.02.2009
Beiträge: 5
dav1d befindet sich auf einem aufstrebenden Ast
Standard

floor - Liefert die nächste ganze Zahl, die kleiner oder gleich dem Parameter value ist


aber floor(12) sollte demnach 12 sein. und nicht 11. nich wahr?
dav1d ist offline  
Alt 24.02.2009, 20:29  
Erfahrener Benutzer
 
Registriert seit: 28.03.2008
Beiträge: 1.846
HPR1974 wird schon bald berühmt werden
Standard

da schlägt eben die ungenauigkeit zu
HPR1974 ist offline  
Alt 24.02.2009, 20:32  
Erfahrener Benutzer
 
Registriert seit: 28.03.2008
Beiträge: 1.846
HPR1974 wird schon bald berühmt werden
Standard

aus dem manual:
Warnung
Fließkommagenauigkeit

Es ist typisch das einfache Dezimalbrüche wie 0.1 oder 0.7 nicht ohne kleine Ungenauigkeiten in ihr internes binäres Gegenstück umgewandelt werden können. Dies kann zu verwirrenden Ergebnissen führen, so ergibt floor((0.1+0.7)*10) in der Regel 7 an Stelle der der erwarteten 8 da die interne Repräsentation eher bei 7.9 liegt.

Dies liegt daran das es unmöglich ist bestimmte Werte mit einer endlichen Anzahl von Nachkommenstellen darzustellen. So wird zum Beispiel 1/3 im Dezimalsystem 0.3.

Sie sollten daher Fließkommawerten nicht bis auf die letzte Nachkommastelle trauen und vor allem niemals Fließkommawerte auf exakte Gleichheit prüfen. Wenn Sie höhere Genauigkeit benötigen können Sie die Mathematikfunktionen für beliebige Genauigkeit oder die gmp-Funktionen nutzen.
HPR1974 ist offline  
Alt 24.02.2009, 20:32  
Neuer Benutzer
 
Registriert seit: 24.02.2009
Beiträge: 5
dav1d befindet sich auf einem aufstrebenden Ast
Standard

Ah. bcdiv ist praktisch. Danke.

Leider heisst das wohl, dass man dem Standard-PHP Operator für Division nicht trauen sollte...
dav1d ist offline  
Alt 24.02.2009, 20:36  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.241
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Zitat:
Sie sollten daher Fließkommawerten nicht bis auf die letzte Nachkommastelle trauen und vor allem niemals Fließkommawerte auf exakte Gleichheit prüfen.
Hmm, naja, exakte Gleichheit. Siehe #2, das Verhalten ist schon arg. Gibt er doch für float *düdeledü* ne 12 aus..
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 24.02.2009, 20:40  
Erfahrener Benutzer
 
Registriert seit: 28.03.2008
Beiträge: 1.846
HPR1974 wird schon bald berühmt werden
Standard

naja wenn man die Zahl mit mehr als 14 Nachkommastellen ausgibt ists keine 12 mehr und es liegt eben an der ungenauigkeit der verwendeten Datentypen.
HPR1974 ist offline  
Alt 24.02.2009, 20:41  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.241
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Ich raff nur nicht, warum
PHP-Code:
var_dump (64.8/5.4); 
dann "12" ausgibt
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 24.02.2009, 20:48  
Neuer Benutzer
 
Registriert seit: 24.02.2009
Beiträge: 5
dav1d befindet sich auf einem aufstrebenden Ast
Standard

... und bei Vergleich mit 12 ein false rauskommt...

Ich würds ja verstehen, wenn man (64.8/5.4)!==12 testet und dieses Verhalten auftritt.
dav1d ist offline  
 


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
Datentypen: varchar(65.535) vs. text coding007 Datenbanken 18 07.07.2010 17:25
Frage zu Datentypen und Indizes tayke Datenbanken 2 29.10.2006 04:00
[MSSQL + PHP] Konflikt zwischen Datentypen / Probleme bei IN winfo_cologne PHP Tipps 2006 3 29.03.2006 14:05
Datentypen in MySQL Datenbanken 12 02.02.2006 15:34
Datentypen und deren Größe Datenbanken 5 29.11.2005 08:38
[erledigt]SQL: Datentypen in Kriterienausdruck unverträglich PHP Tipps 2005-2 2 11.07.2005 09:51
[Erledigt] Select Statement - Order by Problem mit Datentypen Datenbanken 6 03.06.2005 16:02
Dokumentation Datentypen PHPMyAdmin Lia PHP Tipps 2005 3 14.04.2005 15:02
[Erledigt] Java Datentypen umwandeln HTML, Usability und Barrierefreiheit 8 07.02.2005 16:18
Größe einer Datenbank und Datentypen anzeigen Klaus Datenbanken 2 18.12.2004 16:21
Variable Datentypen PHP Tipps 2004-2 8 24.11.2004 00:40
in_array, falsche Datentypen... :-( PHP Tipps 2004 1 21.10.2004 14:38

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php 5.4

Alle Zeitangaben in WEZ +1. Es ist jetzt 03:51 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