从未缩放的 long 创建 BigDecimal

Create BigDecimal from unscaled long

我正在尝试将 long 1099 转换为 BigDecimal 10.99; 这给了我 11.00:

long cost = 1099;
MathContext CENTS = new MathContext(2,RoundingMode.HALF_EVEN);
BigDecimal result = (new BigDecimal(cost,CENTS)).movePointLeft(2);

据我所知,这应该有效。我的愚蠢错误是什么?

错误在于比例和精度之间存在区别。 MathContext 的构造函数接受精度,即小数点两侧的 位数。 (例如,您原来的 BigDecimal 本质上是 11 * 10^2,就好像它是科学记数法一样。)

改为new MathContext(4, RoundingMode.HALF_EVEN)

new BigDecimal( 1099L )
.movePointLeft(2)

使用只带 long 的构造函数,不带 MathContext.

看到这个code run live at IdeOne.com

使用BigDecimal.valueOf(long unscaledVal, int scale)方法:

long cost = 1099;
BigDecimal result = BigDecimal.valueOf(cost, 2);
System.out.println(result); // 10.99