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

Dart中toStringAsFixed与NumberFormat数值处理结果差异的疑问

为什么2.385和1.385的取整结果不一致?

这本质是二进制浮点数的精度限制导致的问题——十进制里的很多小数(比如0.005)无法用二进制有限位精确表示,所以你写的2.385和1.385在内存中存储的实际值并不是精确的十进制数。

具体来看:

  • 2.385实际存储的二进制浮点数略小于2.385(近似值比如2.3849999999999996),当调用toStringAsFixed(2)时,第三位小数的实际值不足0.005,所以会被舍去,得到2.38。
  • 1.385实际存储的二进制浮点数略大于1.385(近似值比如1.3850000000000001),第三位小数的实际值超过0.005,取整时会进一位,得到1.39。

你用NumberFormat得到相同结果,是因为它底层同样依赖浮点数的存储值进行计算,自然会受同样的精度问题影响。

如果是货币这类对精度要求极高的场景,绝对不能用double这类浮点数类型。建议使用专门的十进制精确计算类型,比如Dart中的decimal包,或者直接用整数存储分(而非元)来避免浮点误差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:32:09