比较Unity中的浮动

我的场景中有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”。 无论如何都知道为什么会发生这种情况?

最近的float16.6716.6700000762939453125

最近的float 100.01999664306640625100.01999664306640625

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

在这种特殊情况下,与1e-6的容差进行比较可能是要走的路。

你确实有一个浮点问题。

在团结中你可以而且应该使用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中十进制浮点数和双精度数之间的差异