Dommie: Zehnerpotenzen

Hallo Forum,

wenn ich im JavaScript die 30stellige Zahl 123456789012345678901234567890 ausgeben möchte, erhalte ich aber die Potenzierung: 1.2345678901234567e+29

Kann ich das irgendwie umgehen, vielleicht auch rechnerisch? Ich möchte nämlich die vollständige Zahl mit all seinen 30 Stellen ausgeben.

Danke für alle Vorschläge, Dommie...

  1. Hallo,

    wenn ich im JavaScript die 30stellige Zahl 123456789012345678901234567890 ausgeben möchte, erhalte ich aber die Potenzierung: 1.2345678901234567e+29
    Kann ich das irgendwie umgehen, vielleicht auch rechnerisch? Ich möchte nämlich die vollständige Zahl mit all seinen 30 Stellen ausgeben.

    nein, das ist nicht ohne weiteres möglich. Da müsstest du dir schon die komplette Funktion zur Ausgabe von Zahlen selbst schreiben.

    Abgesehen davon: Ich bin mir nicht sicher, in welchem Datenformat float-Werte in Javascript gespeichert werden. Aber das größte standardisierte IEEE-Fließkommaformat hat 80bit und kann damit etwa 18 gültige Stellen speichern. Die restlichen etwa 12 Stellen wären dann reine Phantasie.

    So long,
     Martin

    --
    Lache, und die Welt wird mit dir lachen.
    Schnarche, und du schläfst allein.
    1. Hallo,

      Ich bin mir nicht sicher, in welchem Datenformat float-Werte in Javascript gespeichert werden.

      Es ist 64-Bit IEEE 754 double precision. (Frag mich nicht, wieviele Stellen dadurch erlaubt sind, ich hab mich da nie eingearbeitet.)

      Mathias

  2. Solche Geschichten kann man nur mit Integerpaketen machen, die die langen Ganzzahlen in ein Integer-Array packen. Die Rechenoperationen müssen dann auch einzeln in Funktionen nachgebildet werden.

    Da JS keine Operator-Syntax für selbstdefinierte Datentypen hat, läßt sich sowas nur mit Funktionsaufrufen handhaben. (In C++ gehen solche Sachen sehr elegant - aber der Teufel steckt wie immer im Detail.)

  3. Hallo,

    Kann ich das irgendwie umgehen, vielleicht auch rechnerisch? Ich möchte nämlich die vollständige Zahl mit all seinen 30 Stellen ausgeben.

    Suche nach einer JS-Bibliothek zum Rechnen mit BCD-Arithmetik (BCD = Binary Coded Decimals) oder verwende die PHP zur Verfuegung stehenden BCMath-Funktionen wie bcadd(), bcmul() usw.

    Aus einem JavaScript-Code heraus bietet sich die Ansprache via AJAX-Aufruf an, als Beispiel mal mit bcmul() umgesetzt.

    bcmul.html:

      
    <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>  
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">  
    <head>  
    <title>Test by TM 02/06</title>  
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />  
    <script type="text/javascript">
    
      
    /* <![CDATA[ */  
      
    var req=null;  
      
    function bcmul(in1,in2)  
    {  
      var url="bcmul.php?in1="+in1+"&in2="+in2;  
      if(window.XMLHttpRequest)req=new XMLHttpRequest();  
      else if(window.ActiveXObject)req=new ActiveXObject("Microsoft.XMLHTTP");  
      
      if(req)  
      {  
        req.onreadystatechange=callback;  
        req.open("GET",url,true);  
        req.send(null);  
      }  
    }  
      
    function callback()  
    {  
      if(req.readyState==4) // complete  
      {  
        if(req.status==200) // OK  
        {  
          var result=req.responseText;  
          if(result)document.forms[0].out.value=result;  
          else alert("Problem aufgetreten!\nStatus: "+req.statusText);  
        }  
      }  
    }  
      
    /* ]]> */
    
      
    </script>  
    </head>  
    <body>  
    <h1>bcmul() mit JS + PHP</h1>  
    <form action="">  
    in1: <input type="text" name="in1" size="100" value="123456789012345678901234567890" /><br />  
    in2: <input type="text" name="in2" size="100" value="987654321098765432109876543210" /><br />  
    out: <input type="text" name="out" size="100" /><br />  
    <input type="button" value="Rechnen" onclick="bcmul(this.form.in1.value,this.form.in2.value)" />  
    </form>  
    </body>  
    </html>
    

    mit bcmul.php:

      
    <?php  
      
      print bcmul($_GET["in1"],$_GET["in2"]);  
      
    ?>
    

    Beispielergebnis: 121932631137021795226185032733622923332237463801111263526900

    MfG, Thomas

    1. [Nachtrag:]

      mit bcmul.php:

      <?php

      print bcmul($_GET["in1"],$_GET["in2"]);

      ?>

        
      etwas verfeinert:  
        
      ~~~php
        
      <?php  
        
        $in1=$_GET["in1"];  
        $in2=$_GET["in2"];  
        
        if(!empty($in1) && !empty($in2) && is_numeric($in1) && is_numeric($in2))  
        print bcmul($in1,$in2);  
        else print "kein Ergebnis erhalten";  
        
      ?>
      

      MfG, Thomas