You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中num/double的“小数异常”问题及简便解决方案咨询

Flutter中num/double小数精度问题的处理方案

问题根源

你遇到的这种精度偏差,本质是二进制浮点数的固有特性:IEEE 754标准下的double类型,无法精确表示所有十进制小数(比如0.1、0.14这类数在二进制里是无限循环的),计算时这些微小的误差会累积放大,导致出现类似0.14 * 100.0 = 14.000000000000002的结果。Android端的表现和其他平台本质一致,都是遵循这个标准,所谓的“平台差异”只是底层实现的细节不同,根源还是浮点数的精度限制。

最简解决方案(无需全面重写计算)

1. 优先用整数存储计算(最推荐)

既然你的业务是小额货币(原价值的100倍),直接把所有金额以整数形式存储和计算(比如把元转成分,0.14元存为14分),完全避开浮点数。只需要在展示或和外部交互时,再把整数转成对应的小数(比如14 / 100 = 0.14)。这种方式零精度损失,代码改动最小——只需要在输入输出层做转换,中间计算逻辑保持不变(把double换成int即可)。

2. 结果层做精度修正

如果暂时不想改存储和计算逻辑,可以在计算结果输出/使用前做四舍五入处理:

  • 保留两位小数:用(0.14 * 100.0).roundToDouble(),得到精确的14.0;
  • 转成字符串展示:用(0.2 + 0.1).toStringAsFixed(2),得到"0.30",避免显示超长小数。
    注意:这种方式只能修正最终结果,中间计算过程仍可能存在误差,适合对精度要求不极端的场景。

关于decimal包的性能疑问

decimal包通过字符串模拟十进制运算来避免浮点数误差,性能确实比原生double差,但在普通货币应用场景下完全可以忽略。除非你需要做十万级以上的批量计算(比如批量对账、大数据统计),才需要考虑性能影响;日常的订单计算、金额统计这类操作,用户根本感知不到差异。

内容的提问来源于stack exchange,提问作者Large

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 03:14:57