如何让Scala BigDecimal显示大量数字?

时间:2011-11-22 06:57:42

标签: scala

执行以下操作

  val num = BigDecimal(1.0)
  val den = BigDecimal(3.0)
  println((num/den)(MathContext.DECIMAL128))

我只得到

0.3333333333333333333333333333333333

小于我想要的128

3 个答案:

答案 0 :(得分:5)

默认上下文是MathContext.DECIMAL128,它用于所有计算,因此在您的示例中,num / den的结果已经舍入到128个位置。您需要先在所有值上设置上下文,然后进行计算。

val mc = new MathContext(512)
val num = BigDecimal(1.0,mc)
val den = BigDecimal(3.0,mc)
println(num/den)

除非您知道算术不会产生无限小数表示,否则请勿尝试使用MathContext.UNLIMITED。在您尝试打印之前它会爆炸。

答案 1 :(得分:2)

MathContext128是IEEE 754R Decimal128格式,34位数。所以输出是正确的(我假设128指的是128位精度,而不是小数)。

我猜你可以用大约四倍的精度制作自己的MathContext:

MathContext moreContext = new MathContext(512); // 512 bits (!) of precision

答案 2 :(得分:1)

这有效:

val mc = new java.math.MathContext(128)
val one_third = (BigDecimal(1, mc) / BigDecimal(3, mc)).toString
// 0. and a bunch of 3

one_third.filter(_ == '3').size // returns 128

如果您使用512,您将获得512'3'数字。