比较 Unity 中的浮点数

Posted

技术标签:

【中文标题】比较 Unity 中的浮点数【英文标题】:Compare floats in Unity 【发布时间】:2017-02-15 08:02:23 【问题描述】:

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

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

【问题讨论】:

调试模式下total的值是多少? @fubo double 就够了。关键是浮点数应该比较是否相等 csharpindepth.com/Articles/General/… @MarkoJuvančič 它是 100.02... 但经过更多研究,我发现 Debug.log 显示四舍五入的值。 【参考方案1】:

您确实遇到了浮点问题。

统一起来,您可以并且应该使用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

【讨论】:

这行得通。我已经试过了。但我想知道为什么会发生这种情况。感谢您的回复,它将帮助大家解决这个问题,但@Snoop Dog 的回答是为什么它真的会发生。【参考方案2】:

最接近float16.6716.6700000762939453125

100.02最近的float100.01999664306640625

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

在这个特殊的情况下,比较tolerance在1e-6的顺序可能是要走的路。

【讨论】:

以上是关于比较 Unity 中的浮点数的主要内容,如果未能解决你的问题,请参考以下文章

Lua和C++中的浮点数的比较

将结构与 rust 中的浮点数进行比较

给出公差比较列表中的浮点数[重复]

与霓虹内在函数中的浮点数比较

java中的浮点数相加

Unity3d - 计算 10 个最近不断变化的浮点数的平均值