Dart简单加法运算出现浮点精度异常的原因及解决方案
问题根本原因
这类计算偏差不是Dart独有的异常,是所有遵循IEEE 754标准实现双精度浮点数(即Dart中的double类型)的编程语言都会存在的通用现象:
- 计算机底层使用二进制存储数值,日常使用的绝大多数十进制有限小数(比如测试用到的0.7、0.8、5.9等),转换为二进制时是无限循环小数
- 双精度浮点数只有固定64位存储空间,无法完整存储无限长度的二进制小数,只能对超出长度的部分做截断近似存储,数值从存入内存开始就存在极其微小的误差
- 多次运算时这些微小误差会累积,最终输出时就会出现类似
6.6000000000000005、50.599999999999994这类和预期十进制结果有细微偏差的情况。
可行解决方案
根据使用场景的不同,可以选择以下方案规避这类问题:
- 高精度计量场景(如金额计算、严格精度要求的科学计算):不要使用
double类型存储运算数值,优先用整数按最小计量单位存储计算,比如金额场景全部以「分」为单位做整数运算,最终展示时再换算为「元」单位,整数运算不存在浮点数精度偏差问题。 - 需直接操作小数的精确计算场景:使用支持十进制精确运算的专用类型处理数值计算,从存储层面避免二进制转换带来的近似误差。
- 仅需结果展示的场景:如果不需要极致运算精度,只需要输出符合日常认知的结果,可以在输出前对结果做指定小数位的格式化,比如调用
num.toStringAsFixed(目标保留小数位数)方法做四舍五入截断,即可过滤掉尾部的误差值。
内容的提问来源于stack exchange,提问作者Serhat Yigit
相关产品推荐
相关产品推荐

