执行以下操作
val num = BigDecimal(1.0)
val den = BigDecimal(3.0)
println((num/den)(MathContext.DECIMAL128))
我只得到
0.3333333333333333333333333333333333
小于我想要的128
答案 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'数字。