2016-10-06 2 views
3

У меня есть 6 InputFields в моей сцене. Их тип содержимого десятичный.Сравнение поплавков в Unity

Я извлекаю значения из этих полей ввода и проверяю, равна ли их сумма 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

Что такое значение общего в режиме отладки? –

+1

@fubo двойной достаточно. Дело в том, что числа с плавающей запятой должны быть * не * сравниваться для равенства –

+0

http://csharpindepth.com/Articles/General/FloatingPoint.aspx?printable=true – mybirthname

ответ

4

Ближайшие float до 16.67 is 16.6700000762939453125.

Ближайший float к 10.02 является 100.01999664306640625

Добавление бывший в себя 5 раз, не точно равна последней, поэтому они не считаются равными.

В этом конкретном случае, по сравнению с толерантности в порядке 1e-6, вероятно, путь.

12

У вас действительно есть проблема с плавающей запятой.

В единстве вы можете и должны использовать 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

+0

Это работает правильно. Я уже пробовал это. Но я хотел знать, почему именно это происходит. Спасибо за ответ, это поможет каждому застрять в этой проблеме, но ответ @Snoop Dog - это то, почему это действительно происходит. –

Смежные вопросы