为了账号安全,请及时绑定邮箱和手机立即绑定

比较Unity中的浮点数

比较Unity中的浮点数

C#
有只小跳蛙 2020-02-02 15:42:17
我的场景中有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”。无论如何,为什么会这样呢?
查看完整描述

2 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

最近float16.6716.6700000762939453125

最近float100.02100.01999664306640625

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

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


查看完整回答
反对 回复 2020-02-02
?
慕村9548890

TA贡献1884条经验 获得超4个赞

您确实有一个浮点问题。


您可以并且应该统一使用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中十进制浮点数和double的区别


查看完整回答
反对 回复 2020-02-02
  • 2 回答
  • 0 关注
  • 1181 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信