BigDecimal.unscaledValue()返回数值×10^scale的BigInteger整数结果,严格遵循value=unscaledValue×10^−scale定义,如"12.34"得1234(scale=2),"0.005"得5(scale=3),且与构造方式无关。
BigDecimal.unscaledValue() 返回的是去除小数点后、按原精度缩放得到的 BigInteger,它代表的是“数值 × 10scale” 的整数结果。这个值不是简单地删掉小数点(比如 12.34 → 1234),而是严格遵循其内部 unscaled value 和 scale 的数学定义:
value = unscaledValue × 10<sup>−scale</sup>。
理解 unscaledValue 的实际含义
例如:
-
new BigDecimal("12.34")→unscaledValue() = 1234,scale() = 2 -
new BigDecimal("0.005")→unscaledValue() = 5,scale() = 3 -
new BigDecimal("100")→unscaledValue() = 100,scale() = 0 -
new BigDecimal("1.23E+2")(即 123)→unscaledValue() = 123,scale() = 0
注意:unscaledValue() 总是整数,且与构造方式无关,只取决于最终数值和精度表示。它不保留原始字符串格式(如前导零、指数写法),但精确反映数学值。
安全转为 long 进行自定义计算
如果确定 unscaledValue 在 long 范围内(≤ 2⁶³−1),可用:
-
bigDecimal.unscaledValue().longValueExact()—— 推荐,抛异常防止溢出 - 避免直接用
.longValue(),会静默截断(如new BigInteger("10000000000000000000")变成负数)
常见自定义处理场景与示例
比如实现“小数点后固定 2 位的整数化金额运算”:
- 将金额统一转为“分”:
cents = amount.unscaledValue().longValueExact()(前提是 scale=2) - 做加减乘除(用 long 算,快且可控),再用
BigDecimal.valueOf(result, 2)恢复为元 - 若需对 unscaledValue 做位运算或哈希(如生成唯一键),可转
byte[]:unscaledValue().toByteArray()
注意事项
不要假设 unscaledValue() 总是“去掉小数点的字符串转整数”。例如:
-
new BigDecimal("12.3400")→unscaledValue() = 123400,scale = 4(不是 1234) -
new BigDecimal(new BigInteger("1234"), 2)→ 同样得 12.34,但 unscaledValue 明确是 1234
所以,若依赖特定 scale(如金融中固定两位),建议先校验:if (bd.scale() != 2) throw ...,再取 unscaledValue,确保语义一致。










