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

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类型存储,建议修改数据解析和存储逻辑:

  1. 解析第三方API返回的JSON数据时,不要将该id字段解析为double类型,直接读取为字符串即可。如果用json_serializable做序列化,可以自定义字段转换逻辑:
// 自定义转换方法,直接将json中的数字转为字符串
String _idFromJson(dynamic id) => id.toString();

// 给id字段加JsonKey注解指定转换逻辑
@JsonKey(fromJson: _idFromJson)
final String id;
  1. 直接将字符串格式的id存入SharedPrefs,完全绕过浮点数精度问题。

临时兼容方案(不推荐)

如果暂时无法修改上游数据获取逻辑,只能拿到double类型的id,需要新增判断逻辑:当id的绝对值超过9007199254740992时做降级提示,小于该阈值时再做转换。

内容的提问来源于stack exchange,提问作者Máté Antal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:06:00