Autor Zpráva
Gričman
Profil *
Dobrý den,

Mám nasledovní kód:
<script>
var a = 555555555555555555;
alert(a);
</script>

Avšak alert() mi pořád vyhazuje nasledovní hodnotu: 555555555555555600, proč je tomu tak? Vypadá to, že s takhle vysokýma hodnotama není možné pracovat. Existuje zpúsob jak možné dělat aritmetické operace i s tak velkými čísly? Kdybych z púvodné hodnoty odebral dvě pětky, tak aritmeticky je možné opět s číslem hezky narábět, ale bohužel o tomhle problému jsem se moc na internetu nedozvěděl. Osvětlení velmi vítáno...
Joker
Profil
Částečně to souvisí s Výsledkem výpočtu 1 - 0.9 není přesně 0.1.

O stejném problému jsem psal do PHP učebnice, jelikož zatím není do budoucna platný odkaz, zkopíruji sem příslušnou část textu. Když si odmyslíte, že příklady jsou v PHP a uvedená přesnost taky platí pro PHP, funguje to obdobně i v Javascriptu.
var_dump(99*99);
var_dump(9999999999*9999999999);
Zatímco výsledkem prvního výpočtu bude normálně 9801 typu int, výsledkem druhého výpočtu je 9.999999998E+19 typu float, což znamená 9.999999998 * 10^19, neboli 99999999980000000000. Všimněte si, že ve skutečnosti má výsledek toho součinu být 99999999980000000001. Opět jde o nepřesnost kvůli způsobu uložení reálných čísel, o které jsme už mluvili. Důležitý poznatek tedy je, že nepřesnost při uložení reálných čísel není pevná, ale závisí na velikosti uloženého čísla. Přesně se uloží prvních 15 cifer čísla. To může vést k paradoxním situacím:
$soucin = 99999999980000000000;
$soucet = $soucin + 100;
var_dump($soucin);
var_dump($soucet)
Všimněte si, že ačkoli proměnná $soucet vznikla přičtením 100 k proměnné $soucin, obsahují obě proměnné stejné číslo! A to dokonce přesto, že ve skriptu máme pouze celá čísla. Je to způsobené mechanismem popsaným výše, tedy příliš vysoké celé číslo se automaticky převedlo na reálné.
_es
Profil
Joker:
Neviem, ako to je teraz v návrhu textu učebnice, no mohlo by tam byť aj spomenuté, že v skutočnosti sa umocňuje 2 a nie 10, z čoho vyplýva napríklad nemožnosť zapísať presne v takom spôsobe uloženia trebárs číslo 0,3.
Gričman
Profil *
Ok.. díky za odpovědi. Řekneme že máme event který zpúsobí,ze se naše proměnná a kterou jsem zapsal do prvního příspěvku inkrementuje o 1. Dá se to vúbec nějak šikovně, aby sa v rámci jedné proměnné dalo pracovat i s takhle velkými čísly? Jestli to možné neni, napadá mně jenom zpúsob, který by takhle velké číslo rozdělil do dvou číselných proměnných a následne by s nima dělal. Přijde mi to avšak velice nemotorné.


Zajímalo jaký postup by někdo z vás zvolil na práci s tak velkými čísly...
_es
Profil
Gričman:
Zajímalo jaký postup by někdo z vás zvolil na práci s tak velkými čísly...
Vymyslieť si vlastný formát čísel, na ktorý by boli použité existujúce fomáty čísel v danom programovacom jazyku a tiež funkcie na prácu s nimi - sčitovanie , násobenie, ... Otázne je, či je ti to vlastne treba a nejde len o nevhodnú prácu s existujúcim a dostatočným formátom čísel.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0