php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
BCMath Problem / Exponentialdarstellung


 
Nuramon
17-11-2008, 12:45 
 
Hi,

ich habe ein ziemlich schwerwiegendes Problem und bin derzeit noch auf keine Lösung gestoßen. Ich arbeite viel mit Floats und bekomme zB zwei Werte aus der Datenbank, die ich mit floatval() umwandle.

Soweit funktioniert das ja auch ganz ordentlich:

$num1 = floatval("100000");
$num2 = floatval("1200000");
var_dump($num1); // float(1.0E+5)
var_dump($num2); // float(1.2E+6)

Jetzt würde ich gerne die beiden Zahlen vergleichen, was ich aufgrund der nötigen Genauigkeit mit BCMath mache, also der Funktion bccomp():

var_dump(bccomp($num1, $num2, 2)); // int(0) -> falsch
var_dump(bccomp(intval($num1), intval($num2), 2)); // int(-1) -> richtig

Nachdem ich ja nicht weiß, ob es sich bei $num1 oder $num2 um ein Integer handelt würde ich gerne auf Floatbasis bleiben, aber anscheinend versteht bccomp hier die Exponentialdarstellung nicht.

Irgendwelche Ideen, wie ich ihm das beibringen kann, oder wie ich die Exponentialdarstellung umrechnen kann?

 
Nuramon
17-11-2008, 13:11 
 
Ok, nach bisschen Weitersuchen bin ich auf die Lösung gestoßen, bei den Kommentaren im PHP Manual. :)

http://www.php.net/manual/en/function.bccomp.php

Ich verwende jetzt folgende Funktion, durch die ich die Parameter von bccomp vorher durchgebe, wenn es sich um eine Exponentialdarstellung handelt:


/**
* Rechnet float von Exponentialdarstellung (zB 1.5e4) in string um
*
* @param float $exp
* @return string
*/
public function exp2str($exp) {
if(stripos($exp, "e") === false)
return $exp;
list($mantissa, $exponent) = spliti("e", $exp);
list($int, $dec) = split("\.", $mantissa);
bcscale($dec);
return bcmul($mantissa, bcpow("10", $exponent));
}

Thread kann geschlossen werden oder so. :)


Alle Zeitangaben in WEZ +2. Es ist jetzt 22:20 Uhr.