使用FieldValue.increment处理小数时求和结果异常的问题
问题原因及解决办法
原因
这是二进制浮点数的精度缺陷导致的:
- 像
988.95这类十进制小数,无法用Java的Double类型(二进制浮点数)精确存储,实际在内存中是一个接近该值的近似值。 - 当你通过
Double.parseDouble()转换输入值,再用FieldValue.increment()进行运算时,这些微小的精度误差会被保留并写入Firestore,最终出现488.95000000005这类带误差的结果。
解决办法
最可靠的方案是用整数类型存储金额:
- 将金额以“分”为单位存储(比如988.95元存为整数
98895),用户输入的500元对应50000。 - 运算时直接对整数做加减,再写入Firestore,完全避免浮点数精度问题。
如果业务场景必须保留小数形式,可以考虑:
- 使用Firestore支持的
Decimal类型(对应Java中的BigDecimal)来处理数值,BigDecimal能精确表示十进制小数,运算后写入的结果会是准确的488.95。
内容的提问来源于stack exchange,提问作者Kumar Harsh
相关产品推荐
相关产品推荐

