比较Unity中的浮动

Sam*_*ain 6 c# floating-point unity-game-engine

我的场景中有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);
   }
Run Code Online (Sandbox Code Playgroud)

我在控制台日志中得到"不等于.你的总和= 100.02".无论如何有任何想法为什么会发生这种情况?

Ria*_*ers 21

你确实有一个浮点问题.

在团结中你可以而且应该使用Mathf.Approximately,它是他们为此目的而建立的实用功能

试试这个

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

另外,作为旁注,如果您计划进行任何具有完全数字至关重要的计算,则应使用小数.它是一个略大的数据结构,因此速度较慢,但​​它的设计不会出现浮点问题.(或至少精确到10 ^ 28)

对于99.99%的情况,浮动和双打就足够了,因为你可以正确地比较它们.

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


小智 5

最近float16.6716.6700000762939453125

最近float100.02100.01999664306640625

将前者加到自身5次并不完全等于后者,因此它们将不会相等。

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