在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的结果。
答案 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?