|
Könntest du bitte die exakte betroffene Zeile nennen? In deiner Frage sind mindestens zwei unterschiedliche Versionen zu finden. :)
– Blauesocke 18.11.09
|
||
| 1 |
Macht es einen Unterschied, ob du mit '8,775' oder 8.775 arbeitest? D.h. ist das Problem beim round oder der Konvertierung von String nach Float?
– BeachBlocker 18.11.09
|
|
| 1 |
Also bei mir kommt in PHP bei echo round(8.775,2); immernoch 8,78 raus. Bitte poste mal deine komplette Zeile bzw. deine Variablenwerte dazu. Grüßle
– Scout 19.11.09
|
$var1 = '8.775';
$var2 = 8.775;
$res1 = round($var1, 2);
$res2 = round($var2, 2);
$res3 = round(8.775, 2);
$res4 = round('8.775', 2);
echo 'res1('.gettype($res1).'): '.$res1;
echo '<br />';
echo 'res2('.gettype($res2).'): '.$res2;
echo '<br />';
echo 'res3('.gettype($res3).'): '.$res3;
echo '<br />';
echo 'res4('.gettype($res4).'): '.$res4;
|
Ich habe das mal C++ statt mit PHP getested:
Die interne Darstellung von 8.78 ist 8.7799999999999994. Mit printf("%lg") wird allerdings "8.78" ausgegeben. Das liegt aber allein an der Ausgaberountine, denn dort wird noch einmal 'gerundet', denn mit printf("%25.20lg") wird das 'richtige' "8.7799999999999994" ausgegeben. Es also nicht an der round Funktion, sondern, dass für 8.78 intern keine exakte Darstellung verwendet wird. FalkP: Probier das doch noch mal bitte mit PHP und einem Ausgabeformat wie %25.20lg". – BeachBlocker 24.11.09
|
||
|
@BeachBlocker: eine Ausgabe mit printf("%.20f", $res1); liefert auf meinem PHP sowohl unter WinXP als auch unter Linux 8.77999999999999936051. Es ist also dann wohl tatsächlich so, dass sich 8.78 nicht als Flieskommazahl mit endlicher (im Sinne eines PC oder Small-Server) Genauigkeit darstellen läßt.
Was lehrt uns das: Traue nie einer Augaberoutine und impliziten Umwandlungen ;) – FalkP 30.11.09
|
<?php
function modify_betrag($betrag)
{
$betrag=str_replace(",",".",$betrag);
$betrag=explode(".",$betrag);
$hauptzahl=$betrag[0];
$stelle_drei=substr($betrag[1],2,1);
$erstenzwei=substr($betrag[1],0,2);
if($erstenzwei =="")
{
$converted=$hauptzahl;
}
else
{
if($stelle_drei =="" or $stelle_drei ==0)
{
$converted=$betrag[0].".".$erstenzwei;
}
else
{
if($stelle_drei >=5)
{
$erstenzwei=$erstenzwei+1;
}
$ranhaengen=$erstenzwei;
if($ranhaengen =="")
{
$converted=$hauptzahl.".00";
}
elseif($ranhaengen>=100)
{
$ranhaengen="00";
$hauptzahl++;
$converted=$hauptzahl.".".$ranhaengen;
}
else
{
$converted=$hauptzahl.".".$ranhaengen;
}
}
}
return $converted;
}
?>
| 1 |
Bitte nächstes Mal die Kommentarfunktion benutzen oder die Frage bearbeiten. Dies ist kein Forum! Die Reihenfolge der Antworten bleibt aufgrund von up- und downvotes nicht immer gleich.
– balu 24.11.09
|
|
|
Ich weiß,.. aber wenn ich die Kommentarfunktion nutze, wäre es in der Frage drin. Hier handelt es sich aber um eine Lösung, die up oder downgevotet werden kann ;-)
– Martin Bassus 30.11.09
|
echo round(8.775,2);
// 8.78
|
Hab wohl die Überschrift übersehen :)
Aber: round('8.775',2) MUSS ja komische Werte liefern, weil '8.775' implizit auf was auch immer gecastet wird. – DaSpors 18.11.09
|