Search code examples
scalabigintegerbigdecimal

[scala]How to make the BigDecimal is exact to integer part?


On scala my BigDecimal is 3.721443204405954385563870541379242E+54 I would like to result to 3721443204405954385563870541379246659709506697378694300

My result is: 3.114968783111033211375362915188093E+41 I would like to result to be: 311496878311103321137536291518809134027240

I do not know the scale and the result should be only show the integer part.

val multimes:(Int, Int)=>BigDecimal=(c:Int, begin:Int)=>{
if(c==1)
  BigDecimal.apply(begin)
else
  multimes(c-1, begin)*(c+begin-1)
}

def mulCount(c:Int):BigDecimal={
val upper=multimes(c,c+1)
val down=multimes(c,2)
upper/down
}

the number is the result of function mulCount.


Solution

  • The BigDecimal class has a number of nonintuitive behaviors in Scala 2.10. This will get better in 2.11, but I can't quite tell from your example whether it will fix what you want. Probably not; Scala has a default MathContext which keeps about 128 bits of information (~34 decimal digits), and I think that's what you're running into here.

    If you don't have a decimal problem--and here you don't--then the easiest thing to do is just use BigInt instead. It will scale to however many digits you actually need.

    If you must express this as a decimal problem, you should explicitly supply a MathContext that has enough digits:

    if (c==1) BigDecimal.apply(begin, new java.math.MathContext(60))
    

    and that MathContext will, if always used on the left-hand side of operations, propagate through to your result.