# JavaScript Woes

## The problem is "a lack of precision"

While JavaScript is quickly becoming the lingua franca of the web, this general purpose language contains built-in limitations which restrict its use to simple applications. For example, I recently attempted to write a Diffie-Hellman Key-Exchange Demo in JavaScript but detected problems during testing which I traced to a lack of mathematical precision. Check out these comparisons:

 JavaScript Math.pow(7,18) 1,628,413,597,910,449 correct Calculator 7^18 1,628,413,597,910,449 correct JavaScript Math.pow(7,19) 11,398,895,185,373,144 incorrect Calculator 7^19 11,398,895,185,373,143 correct JavaScript Math.pow(7,20) 79,792,266,297,612,000 incorrect Calculator 7^20 79,792,266,297,612,001 correct JavaScript Math.pow(7,21) 558,545,864,083,284,030 incorrect Calculator 7^21 558,545,864,083,284,007 correct
• Many junior programmers think this problem is related to internal rounding but it is actually a limitation due to float-point math.
• Many seasoned programmers are surprised to learn that all JavaScript numbers (floating point or not) are stored in 64-bit floating point format (similar to JAVA's double) and there are no official alternative data types. Without an official integer data type, divisions may produce a fractional result.
• The only way to fix this IN YOUR JS PROGRAMS is to engage an external library
• References:
• JavaScript workarounds:
• Other workarounds:
• for client side software, switch to JAVA
• for server side software, switch to PERL

## PERL Workaround

```Legend:	<sr> = system response
<ur> = user response

<sr>	\$
<ur>	type bigint_demo.pl
#
#       title: bigint_demo.pl
#
use bigint;             # use bigint after this point
\$x = 7 ** 19;           # x = 7^19
printf("%s\n",\$x);      # "%s" because other formats bomb
<sr>	\$
<ur>	perl bigint_demo.pl
<sr>	11398895185373143	! correct
<ur>	\$```