C# 失去精度从而使等式结果为 0

C# losing precision thus making equation result 0

我的精度有问题。我将许多非常低的数字(例如 0.000001)彼此相乘很多次(有时在 500-1000 左右),因此我失去了精度。我的数字在 double 中(也在字典中)。

有办法解决这个问题吗? 这是代码:

foreach (var word in fileDictionary)
{
    dictionaryTotal.TryGetValue(word.Key, out percent);
    temp = percent;
    A *= temp;
    B *= (1 - temp);
}

A/B 在此示例中变为 0.0

您可以使用对数,然后根据需要处理结果。

foreach (var word in fileDictionary)
{
    dictionaryTotal.TryGetValue(word.Key, out percent);

    temp = percent;

    A += Math.Log10(temp);
    B += Math.Log10(1 - temp);
}

然后您可以对生成的对数进行运算,而不是对生成的数字进行运算。

如果您希望最终 A/B 结果超出双倍幅度范围,最好的解决方案是使用 .

中建议的对数

如果temp变化,你不需要A或B,最终的A/B结果应该是double range,如果不是可以当成0,你可以通过直接计算比率来得到它:

ratio = ratio * temp / (1 - temp)