Using java.math.BigInteger in Nashorn / jjs?

Roland Bouman roland.bouman at gmail.com
Tue Dec 29 01:53:41 UTC 2015


Hi all,

I'm new to this list - apologies if this topic came up earlier,

I'm trying to work use java,math,BigInteger in my javascript - obviously to
overcome the limitations of the JavaScript built-in Number type.

Please consider the concrete example of a Java function I would like to get
working in Nashorn / jss javascript below:

  public static BigInteger fibonacci(int n) {
    BigInteger prev = new BigInteger("0");
    if (n == 0) {
      return prev;
    }
    BigInteger next = new BigInteger("1");
    if (n == 1) {
      return next;
    }
    BigInteger fib = null;
    int i;
    for (i = 1; i < n; i++) {
      fib = prev.add(next);
      prev = next;
      next = fib;
    }
    return fib;
  }

We can test with these values:

n=77: 5527939700884757
n=78: 8944394323791464
n=79: 14472334024676221

So far so good. Now I try the - what I think is - equivalent function in
javascript:

function fibonacci(n) {
  var BigInteger = Java.type("java.math.BigInteger");
  prev = new BigInteger("0");
  if (n == 0) return prev;

  next = new BigInteger("1");
  if (n == 1) return next;

  var i, fib = null;
  for (i = 1; i < n; i++) {
    fib = prev.add(next);
    prev = next;
    next = fib;
  }
  return fib;
}

However, now we get different results:

n=77: 5527939700884757
n=78: 8944394323791464
n=79: 14472334024676220

Note that the value for n=79 is off by one.

What I suspect happens is that the next passed to .add gets first evaluated
and then silently cast to a javascript Number type before it is actually
passed into add (at which point it will probably need to be converted to a
BigInteger again) but then it will have lost its precision already.

A simpler example can be shown here:

var str, BigInteger = Java.type("java.math.BigInteger");
str = "9999999999999998";
print(str + ": " + (new BigInteger(str)).toString());
str = "9999999999999999";
print(str + ": " + (new BigInteger(str)).toString());

outputs:
9999999999999998: 9999999999999998
9999999999999999: 10000000000000000

(whereas in java the ouput checks out as expected)

Is there anything I can do to make BigInteger additions work in jss /
Nashorn javascript code?

Thanks in advance,

-- 
Roland Bouman
blog: http://rpbouman.blogspot.com/
twitter: @rolandbouman
linkedin: http://www.linkedin.com/profile/view?id=5142800&trk=tab_pro

Author of "Pentaho Solutions" (Wiley, ISBN: 978-0-470-48432-6
http://tinyurl.com/lvxa88) and "Pentaho Kettle Solutions" (Wiley, ISBN:
978-0-470-63517-9 http://tinyurl.com/33r7a8m)


More information about the nashorn-dev mailing list