2011-01-02 9 views
12

Ich brauche Hilfe beim Umwandeln eines Strings, der eine Zahl in wissenschaftlicher Notation enthält, in ein Double.Konvertiere einen String mit einer Zahl in wissenschaftlicher Notation in ein Doppel in PHP

Beispiel Strings: „1.8281e-009“ „2.3562e-007“ „0,911348“

ich über nur daran denke die Nummer in der Zahl auf der linken Seite zu brechen und den Exponenten und als nur tun die Mathematik, um die Zahl zu erzeugen; Aber gibt es einen besseren/Standard Weg dies zu tun?

Antwort

10

PHP ist typeless dynamisch typisiert, was bedeutet, dass es Werte analysieren muss, um ihre Typen zu bestimmen (aktuelle Versionen von PHP haben type declarations).

In Ihrem Fall können Sie einfach eine numerische Operation ausführen, um PHP zu zwingen, die Werte als Zahlen zu betrachten (und es versteht die wissenschaftliche Notation x.yE-z).

Versuchen zum Beispiel

foreach (array("1.8281e-009","2.3562e-007","0.911348") as $a) 
    { 
    echo "String $a: Number: " . ($a + 1) . "\n"; 
    } 

nur 1 Zusatz (auch Null abziehen könnte) werden die Saiten werden Zahlen, mit der richtigen Menge an Dezimalstellen machen.

Ergebnis:

String 1.8281e-009: Number: 1.0000000018281 
    String 2.3562e-007: Number: 1.00000023562 
    String 0.911348: Number: 1.911348 

Sie könnten auch das Ergebnis werfen mit (float)

$real = (float) "3.141592e-007"; 
+4

Es ist nicht typlos. Mit 'is_string' und 'is_int' können Sie z. B. noch Strings und Ints unterscheiden. Es ist dynamisch typisiert, mit vielen impliziten Konvertierungen. Abgesehen davon ist dies eine gute Antwort. –

+0

oh, wusste nicht, php versteht wissenschaftliche Notation. Genau das habe ich gebraucht. Danke –

+0

@Matthew Ich sagte * Programmierung weise *. Beim Programmieren müssen Sie sich nicht speziell um die Typen kümmern. Natürlich speichert PHP intern Typen. * Dynamisch getippt * ist besser geeignet - aber ich bin mir nicht sicher, ob ein Anfänger diese Definition besser verstehen wird. –

9
$f = (float) "1.8281e-009"; 
var_dump($f); // float(1.8281E-9) 
1
$float = sprintf('%f', $scientific_notation); 
$integer = sprintf('%d', $scientific_notation); 
if ($float == $integer) 
{ 
    // this is a whole number, so remove all decimals 
    $output = $integer; 
} 
else 
{ 
    // remove trailing zeroes from the decimal portion 
    $output = rtrim($float,'0'); 
    $output = rtrim($output,'.'); 
} 
2

folgende Codezeile kann Ihnen helfen, Bigint Wert anzuzeigen,

$token= sprintf("%.0f",$appdata['access_token']); 

beziehen sich auf diese link.

3

fand ich einen Beitrag, der number_format verwendet, um den Wert von einem Schwimmer wissenschaftliche Notation Zahl auf eine nicht-wissenschaftliche Notation Zahl zu konvertieren:

http://jetlogs.org/2008/02/05/php-problems-with-big-integers-and-scientific-notation/

Anmerkung der Redaktion: Link verfault ist

Beispiel von der Post:

$big_integer = 1202400000; 
$formatted_int = number_format($big_integer, 0, '.', ''); 
echo $formatted_int; //outputs 1202400000 as expected 

HTH

+4

[Ihr Link ist tot] (http://jetlogs.org/2008/02/05/php-problems-with-big-integers-and-scientific-notation/) ... 404 – Sparky

0

Verwenden number_format() und rtrim() Funktionen zusammen.

zB
//eg $sciNotation = 2.3649E-8 
$number = number_format($sciNotation, 10); //Use $dec_point large enough 
echo rtrim($number, '0'); //Remove trailing zeros 

habe ich eine Funktion, mit mehr Funktionen (Wortspiel nicht beabsichtigt)

function decimalNotation($num){ 
    $parts = explode('E', $num); 
    if(count($parts) != 2){ 
     return $num; 
    } 
    $exp = abs(end($parts)) + 3; 
    $decimal = number_format($num, $exp); 
    $decimal = rtrim($decimal, '0'); 
    return rtrim($decimal, '.'); 
} 
0
function decimal_notation($float) { 
     $parts = explode('E', $float); 

     if(count($parts) === 2){ 
      $exp = abs(end($parts)) + strlen($parts[0]); 
      $decimal = number_format($float, $exp); 
      return rtrim($decimal, '.0'); 
     } 
     else{ 
      return $float; 
     } 
    } 

Arbeit mit 0.000077240388