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

为何double类型使用+=运算符会产生精度异常数值?

浮点数精度异常问题的解决方案

问题根源

double是二进制浮点数,它无法精确表示所有十进制小数(比如0.1、0.001这类常见的步长值)。当你反复累加这类无法精准存储的数值时,微小的精度误差会不断累积,最终出现0.000019999999997或1.00002999999997这类偏离预期的结果,哪怕调整步长大小也无法从根本上解决。

可行解决办法

1. 改用decimal类型

decimal是专门为十进制精确计算设计的数值类型,能完美适配你的场景。修改代码如下:

List<decimal> answers = new List<decimal>();
decimal i = startingPoint; // 注意startingPoint和endingPoint也要同步转为decimal类型
decimal prei = 0;

decimal preAbsoluteValueOfResult = 0;
while (i <= endingPoint)
{
    prei = i;
    i += 0.001m; // 用m后缀标记decimal字面量
}

2. 用整数计数间接计算数值

避免直接累加小数,改用整数记录步数,通过乘法推导当前数值,从源头减少误差累积:

List<double> answers = new List<double>();
int stepCount = 0;
const double step = 0.001;
double currentValue = startingPoint;

double preAbsoluteValueOfResult = 0;
while (currentValue <= endingPoint)
{
    prei = currentValue;
    stepCount++;
    currentValue = startingPoint + stepCount * step;
}

3. 比较时设置误差容忍范围

如果必须保留double类型,判断循环条件时不要用精确相等逻辑,给终点值加一个极小的误差阈值(比如1e-9):

while (i <= endingPoint + 1e-9)
{
    prei = i;
    i += 0.001;
}

这种方式可以避免精度误差导致循环提前终止或过度执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:50:53