Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [js] niepoprawne sumowanie/odejmowanie liczb 20-to cyfrowych
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
Czadus
Witam.

Mam niewielki problem z JS. Otóż mam dwa pola formularza, w które wpisuję liczby 20-to cyfrowe. Następnie do trzeciego pola formularza mam wpisać automatyczną sumę lub też różnicę tych dwóch pól. Wiadomo, muszę te dwa pola sparsować, bo to stringi. I tak też robię, pojawia się jednak problemgdy wpisana liczba jest zbyt duża. Podam przykład:

P1: 00000001
P2: 99999999
S: P2-P1 = 99999998

I to jest ok, ale gdy wpiszę dane:

P1: 00000000000000000001
P2: 99999999999999999999
S: P2-P1 = 100000000000000000000

Czy int nie przechowuje tak dużych liczb?? Czy może przyczyna jest w innym miejscu??

Kod JS:
Kod
function funcSum(nr)
   {
       var zm1 = parseFloat(document.getElementById("pierwszynumer").value, 10);
       var zm2 = parseFloat(document.getElementById("ostatninumer").value, 10);
       var zm3 = parseFloat(document.getElementById("iloscrecept").value, 10);
      
       switch(nr)
       {
           case 1:
           {
               if(zm1 && zm2)         document.getElementById("iloscrecept").value=(zm2-zm1);
               else if(zm1 && zm3) document.getElementById("ostatninumer").value=(zm1+zm3);
               break;
           }
           case 2:
           {
               if(zm1 && zm2)         document.getElementById("iloscrecept").value=(zm2-zm1);
               else if(zm2 && zm3) document.getElementById("pierwszynumer").value=(zm2-zm3);
               break;
           }
           case 3:
           {
               if(zm1 && zm3)         document.getElementById("ostatninumer").value=(zm1+zm3);
               else if(zm2 && zm3) document.getElementById("pierwszynumer").value=(zm2-zm3);
               break;
           }
       }
      
       return true;
   }


Kod XHTML:
Kod
<table>
       <tbody>
           <tr><td>Pierwszy numer z zakresu</td><td><input type="text" value="" onblur="funcSum(1);" id="pierwszynumer" name="pierwszynumer"/></td></tr>
           <tr><td>Ostatni numer z zakresu</td><td><input type="text" value="" onblur="funcSum(2);" id="ostatninumer" name="ostatninumer"/></td></tr>
           <tr><td>Ilość recept</td><td><input type="text" value="" onblur="funcSum(3);" id="iloscrecept" name="iloscrecept"/></td></tr>
           <tr><td>Nazwa świadczeniobiorcy</td><td><input type="text" value="" name="swiadczeniobiorca"/></td></tr>
           <tr><td><input type="submit" value="dalej" name="dalej2"/></td><td/></tr>
       </tbody>
   </table>


Proszę o rady, pomoc, sugestie
osl
na początku witam, jako że to mój pierwszy post tutaj winksmiley.jpg

Int w JS zdaje się obsługuje -2^31 do 2^31-1, względnie 2^32-1, czyli odrobinę z zakresu liczb 10-cio cyfrowych...
także musisz znaleźć inne rozwiązanie.

mi na szybko przychodzą do głowy tylko metody rodem z C, może ktoś bardziej 'naumiany' JS zna lepszy sposób na to...
erix
http://lmgtfy.com/?q=big%20numbers%20js
Czadus
Ja tutaj zastanawiam się nad rozbiciem całości na dwie części, czyli zamiast 20-to cyfrowej liczby, mieć dwie 10-cio cyfrowe. O przekroczeniu zakresu też myślałem, tylko nie zdawałem sobie sprawy, że js pod tym względem jest tak ograniczony.

A jaki masz sposób rodem z C?? Mam trochę styczności z programowaniem, więc śmiało możesz zapodać. Jeżeli nie na forum (jeszcze ktoś posądzi o pisanie nie na temat), to na PW.
osl
sposób zupełnie na piechote - implementacja najzwyklejszego dodawania pisemnego.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.