Как я могу определить, должен ли результат деления с плавающей точкой быть целым числом? - PullRequest
2 голосов
/ 24 мая 2019

Я хочу знать, получу ли я целое число или число с плавающей точкой после деления.

if (5.4 / 0.8 ==integer)  // except something that would evaluate as true in this case

{

}

Ответы [ 5 ]

3 голосов
/ 24 мая 2019

Вычисление числа с плавающей запятой сопряжено с проблемой точности.
Например, 0.3 / 0.1 равно 2.9999999999999996, а не 3.
Для сравнения вам нужно округлить их и проверить, является ли разница приемлемой.

var result = 0.3 / 0.1;
if (Math.Abs(Math.Round(result) - result) < 0.0000001) 
{
    // Do something
}
3 голосов
/ 24 мая 2019

Один из способов сделать это - использовать Mathf.Round для поиска ближайшего целого числа к результату и Mathf.Approximately для сравнения этого целого числа с результатом:

float f1 = 0.5;
float f2 = 0.1;
float result = f1/f2;

if (Mathf.Approximately(result, Mathf.Round(result)) {
    Debug.Log("integer result");
}
1 голос
/ 24 мая 2019

Другие примеры, использующие библиотеку Math, безусловно, лучше, но другой способ сделать это - преобразовать значения в decimal перед делением (чтобы преобразование позаботилось о округлении), а затем обеспечение отсутствия остатка при делении результата на 1:

private static bool DivisionIsInteger(double numerator, double denominator)
{
    return (decimal) numerator / (decimal) denominator % 1 == 0;
}

Обратный отсчет до ой комментария от @elgonzo начинается ... сейчас

0 голосов
/ 24 мая 2019

Попробуйте это:

var div = 5.4 / 0.8;
var divRound = Math.Round(div);

if (div == divRound)
{
    Console.WriteLine("Is integer");
}
else
{
    Console.WriteLine("Is Float");
}
0 голосов
/ 24 мая 2019

Я думаю, что самый быстрый способ это:

var a = 5.4;
var b = 0.8;
var result = a / b;
var isInteger = result % 1 == 0;

if (isInteger)
{
    ....
}

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...