我的场景中有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"在我的控制台日志中。 无论如何有任何想法为什么会发生这种情况?
答案 0 :(得分:18)
你确实有一个浮点问题。
在团结中你可以而且应该使用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%的案例,浮动和双打就足够了,因为你可以正确地比较它们。
可以在此处找到更深入的解释:Difference between decimal float and double in .net
答案 1 :(得分:4)
最近的float
到16.67
是16.6700000762939453125
。
最近的float
到100.02
是100.01999664306640625
将前者添加到自身5次并不完全等于后者,所以他们不会比较相等。
在这个特定的案例中,与1e-6的容差进行比较可能是要走的路。