C# 如何比较单(浮点)类型?

C# 如何比较单(浮点)类型?,c#,floating-point,C#,Floating Point,我的场景中有6个输入字段。其内容类型为十进制 我从这些输入字段中获取值,并检查它们的和是否等于100.02。我在所有这些中都输入了16.67 float fireP = float.Parse(firePercentage.text); float waterP = float.Parse(waterPercentage.text); float lightP = float.Parse(lightPercentage.text); float ni

我的场景中有6个输入字段。其内容类型为十进制

我从这些输入字段中获取值,并检查它们的和是否等于100.02。我在所有这些中都输入了16.67

    float fireP   =  float.Parse(firePercentage.text);
    float waterP  =  float.Parse(waterPercentage.text);
    float lightP  =  float.Parse(lightPercentage.text);
    float nightP  =  float.Parse(nightPercentage.text);
    float natureP =  float.Parse(naturePercentage.text);
    float healthP =  float.Parse(healthPercentage.text);

    float total = fireP + waterP + lightP + nightP + natureP + healthP;

   if (total == 100.02f)
   {
     Debug.Log("It's equal");
   }
   else
   {
     Debug.Log(" Not equal. Your sum is = " + total);
   }
在我的控制台日志中,我得到“不相等。你的总和=100.02”。
不管怎样,你知道为什么会这样吗

距离
16.67
最近的
float
16.670000762939453125


距离
100.02
最近的
float
100.0199966460625

将前者加5次与后者并不完全相等,因此它们不会比较相等


在这种特殊情况下,与1e-6顺序的公差进行比较可能是一种方法。

您确实存在浮点问题

在unity中,您可以也应该使用它,这是他们为此目的构建的实用函数

试试这个

if (Mathf.Approximately(total, 100.02f))
{
    Debug.Log("It's equal");
}
else
{
   Debug.Log(" Not equal. Your sum is = " + total);
}
此外,作为一个补充说明,如果您计划进行任何计算,而精确的数字是至关重要的,那么您应该使用小数。它是一个稍大的数据结构,因此速度较慢,但其设计不存在浮点问题。(或至少精确到10^28)

对于99.99%的情况,浮点数和双倍点数就足够了,只要您正确比较它们


这里可以找到更深入的解释:

调试模式下的total值是多少?@fubo double就足够了。问题是,不应该对浮点数进行比较equality@MarkoJuvančič它是100.02。。。但是经过更多的研究,我发现Debug.log显示了四舍五入的值。这是正确的。我已经试过了。但我想知道为什么会发生这种情况。谢谢你的回复,这将帮助每个人在这个问题上陷入困境,但@Snoop Dog的答案是为什么它真的发生了。