【问题标题】:Why List<float>.Sum() and manual sum of numbers gives different result in C#?为什么 List<float>.Sum() 和手动数字总和在 C# 中给出不同的结果?
【发布时间】:2025-12-11 10:25:01
【问题描述】:

在 C# 中我有以下代码:

public static float sum(List<float> array)
    {
        float result = 0.0f;
        for (int i = 0; i < array.Length; i++)
            result += array[i];

        float lSum = array.Sum();

        return result;
    }

为什么这两种“不同”方法的结果不同?

对于长度为 911380 元素的数组 result=620246lSum=620235.8 em>

什么是 List.Sum 的内部实现,哪个答案是正确的?是 C# 语言/库的问题还是取决于 Windows 中 + 的实现?

我们对人类大脑和心脏活动进行研究,我们需要正确的结果,所以我感谢任何形式的帮助!提前非常感谢。

【问题讨论】:

  • FWIW 每个元素的误差为 1.1x10^-5。不确定您是否会获得更好的精度,因为float 只能精确到 6 或 7 位数字。使用double 可能会获得更好的结果。没有回答为什么两个答案不同的问题。
  • 您的实际代码是使用数组还是列表?我想知道因为 .Length 适用于数组,而对于 List 它应该是 .Count
  • 感谢@Ciara 注意到这一点。写应该有.Count。我的原始代码是:sum(List&lt;float&gt; array, int from, int to) ... for (int i = from; i &lt; to; i++)我进行了就地修改,我犯了错误;)

标签: c# windows sum shared-libraries


【解决方案1】:

Sum extension method 使用double 来累积结果,并且只转换为float 来返回它,所以它比使用float 更精确:

public static float Sum(this IEnumerable<float> source) 
{
    if (source == null) throw Error.ArgumentNull("source");
    double sum = 0;
    foreach (float v in source) sum += v;
    return (float)sum;
}

【讨论】:

  • 谢谢@jakub 你是对的,最好使用double 来累积结果并重新输入以获得正确的结果。正如@lc 在他的评论中提到的那样,这是错误的累积。当我通过重新输入result 进行double 积累时,结果是一样的:)
最近更新 更多