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

计算用户行走累计距离时Double值突变为NaN的问题求助

累计GPS行走距离时Double值随机变为NaN的问题排查与解决方案

问题根源

你遇到的NaN问题,核心原因是acos函数的输入超出了有效范围:acos仅接受[-1, 1]之间的数值,但由于GPS定位的微小误差或浮点计算精度问题,你公式里的余弦值计算结果可能会出现类似1.0000000001或-1.0000000001的情况,此时acos会直接返回NaN。

另外你函数里的toStringAsFixed(2)再转double的操作属于多余步骤,不仅降低性能,还可能额外引入精度问题。

解决方案

1. 修复自定义距离计算函数

给余弦计算结果添加范围钳制,确保输入acos的数值始终在有效区间内:

double distance(Position start, Position current){
  final cosTheta = sin(start.latitude) * sin(current.latitude) +
      cos(start.latitude) * cos(current.latitude) * cos(current.longitude - start.longitude);
  // 强制把数值限制在[-1, 1],避免acos返回NaN
  final clampedCosTheta = cosTheta.clamp(-1.0, 1.0);
  final distanceKm = acos(clampedCosTheta) * 6371;
  return double.parse(distanceKm.toStringAsFixed(2));
}

2. 直接使用geolocator内置函数(推荐)

你误解了distanceBetween的作用——它本身就是计算两点间的球面距离(和你自定义函数的逻辑完全一致),并非仅计算直线距离。用它替代自定义函数,既能避免NaN问题,还能获得更好的性能(原生实现):

// 计算两段GPS点的距离(单位:米)
final double segmentDistance = Geolocator.distanceBetween(
  previousPosition.latitude,
  previousPosition.longitude,
  currentPosition.latitude,
  currentPosition.longitude,
);
// 转换为公里并累加(按需调整单位)
totalDistance += segmentDistance / 1000;

额外优化建议

  • 不要每帧调用距离计算:GPS更新无需这么频繁,可通过geolocator设置位置更新间隔(比如每1秒)或位移阈值(比如移动超过1米再更新),减少无效计算。
  • 累加时避免频繁格式化:总距离先以原始double累加,最终展示时再做保留小数处理,提升性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:20:23