c#失去了精度,使得方程结果为0

本文关键字:方程 结果 失去 精度 | 更新日期: 2023-09-27 17:49:19

我有一个精度问题。我将很多非常低的数字,比如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

c#失去了精度,使得方程结果为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结果预计将是双范围,或者如果不是,则可以将其视为零,您可以通过直接处理比率来获得它:

ratio = ratio * temp / (1 - temp)