[scala]如何使BigDecimal精确到整数部分?

时间:2014-01-28 20:49:40

标签: scala biginteger bigdecimal

在scala上我的BigDecimal是3.721443204405954385563870541379242E + 54 我想得到3721443204405954385563870541379246659709506697378694300

我的结果是: 3.114968783111033211375362915188093E + 41 我想结果是: 311496878311103321137536291518809134027240

我不知道比例,结果应该只显示整数部分。

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
}

该数字是函数mulCount的结果。

2 个答案:

答案 0 :(得分:1)

BigDecimal类在Scala 2.10中有许多非直观的行为。这将在2.11中变得更好,但我无法从你的例子中看出它是否能解决你想要的问题。可能不是; Scala有一个默认的MathContext,它保存了大约128位的信息(大约34位十进制数字),我认为这就是你在这里遇到的。

如果你没有小数问题 - 这里你没有 - 那么最简单的方法就是使用BigInt代替。它会扩展到你实际需要的多少数字。

如果您必须将此表示为小数问题,则应明确提供具有足够数字的MathContext

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

如果MathContext总是在操作的左侧使用,那么{{1}}将传播到您的结果。

答案 1 :(得分:1)

听起来好像你最关心数字的外观,并且不想用指数用科学记数法来看。

这是仅打印BigDecimal的默认行为,无法覆盖。但是可以在打印之前将其显式转换为String。

这应该可以解决问题:

val bd: BigDecimal = ...
println(bd.bigDecimal.toPlainString)

那说......为什么不直接使用BigInt?