Dart中double调用toStringAsFixed出现非预期舍入问题怎么解决
问题根源
你遇到的转换偏差本质是64位双精度浮点数(double)的整数精度限制导致的:
- Dart中的double遵循IEEE 754标准,仅能精确存储绝对值≤
2^53(即9007199254740992,约9e15)的整数 - 你用到的id值
43449716574226770已经远超这个阈值,此时这个值存入double时就已经发生了精度丢失,内存中存储的实际值就对应43449716574226768,后续无论用toStringAsFixed(0)还是toInt().toString()转换都只能拿到偏差后的结果 - 部分id转换正常的原因就是这些id的数值≤
2^53,可以被double精确存储
解决方案
最优方案:从源头避免用double存大整数id
这类超出精度范围的数值本身就不适合用double类型存储,建议修改数据解析和存储逻辑:
- 解析第三方API返回的JSON数据时,不要将该id字段解析为double类型,直接读取为字符串即可。如果用
json_serializable做序列化,可以自定义字段转换逻辑:
// 自定义转换方法,直接将json中的数字转为字符串 String _idFromJson(dynamic id) => id.toString(); // 给id字段加JsonKey注解指定转换逻辑 @JsonKey(fromJson: _idFromJson) final String id;
- 直接将字符串格式的id存入SharedPrefs,完全绕过浮点数精度问题。
临时兼容方案(不推荐)
如果暂时无法修改上游数据获取逻辑,只能拿到double类型的id,需要新增判断逻辑:当id的绝对值超过9007199254740992时做降级提示,小于该阈值时再做转换。
内容的提问来源于stack exchange,提问作者Máté Antal
相关产品推荐
相关产品推荐

