foojay
Java精确处理价格:十进制字符串与BigDecimal陷阱
文章讨论Java中价格数据的精确处理问题。double采用二进制浮点,无法精确表示多数十进制小数,累加、比较和存储时会产生误差,因此价格API常以字符串传输。使用Jackson解析时,应通过new BigDecimal(node.asText())读取字符串价格,避免decimalValue()对非数字节点返回零或asDouble()重新引入精度问题;若价格以JSON数字形式出现,应启用USE_BIG_DECIMAL_FOR_FLOATS。文章还总结了BigDecimal的常见陷阱:不要用double构造器,应基于字符串创建;比较价格用compareTo而非equals;divide必须指定小数位和舍入模式或MathContext;输出用toPlainString()避免科学计数法;不同工具默认舍入模式不同,应明确选择并只在最后舍入。最后以一个多币种资产估值程序演示完整流程。