比较Unity中的浮动

本文关键字:Unity 比较 | 更新日期: 2023-09-27 18:11:45

我的场景中有6个InputFields。它们的内容类型为十进制。

我从这些输入字段中获取值,并检查它们的总和是否等于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"。无论如何,你知道为什么会发生这种事吗?

比较Unity中的浮动

您确实存在浮点问题。

在unity中,你可以也应该使用Mathf.Approximately,这是他们专门为此目的构建的一个实用函数

试试这个

if (Mathf.Approximately(total, 100.02f))
{
    Debug.Log("It's equal");
}
else
{
   Debug.Log(" Not equal. Your sum is = " + total);
}

此外,作为附带说明,如果您计划进行任何具有精确数字至关重要的计算,则应使用小数。它是一个稍大的数据结构,因此速度较慢,但它的设计没有浮点问题。(或至少精确到10^28(

对于99.99%的情况,如果您正确地比较它们,浮动和加倍就足够了。

可以在这里找到更深入的解释:.net 中小数浮点和双精度之间的差异

16.67最近的float16.6700000762939453125

100.02最近的float100.01999664306640625

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

在这种特定的情况下,与1e-6量级的公差进行比较可能是可行的。