Проверьте, является ли число двойным или целым - PullRequest
5 голосов
/ 04 сентября 2011

Я пытаюсь украсить программу, отображая 1,2, если оно равно 1,2, и 1, если это 1, проблема: я сохранил числа в массиве в виде двойных чисел. Как я могу проверить, является ли число двойным или целым?

Ответы [ 3 ]

19 голосов
/ 04 сентября 2011

Ну, вы можете использовать:

if (x == Math.floor(x))

или даже:

if (x == (long) x) // Performs truncation in the conversion

Если условие истинно, т.е. выполняется тело оператора if, то значениеявляется целым числомВ противном случае это не так.

Обратите внимание, что при этом значение 1.00000000001 будет по-прежнему двойным - если это значения, которые были вычислены (и поэтому могут быть просто "очень близки" к целочисленным значениям)Вы можете добавить немного терпимости.Также обратите внимание, что это приведет к ошибке для очень больших целых чисел, так как они все равно не могут быть точно представлены в double - вы можете рассмотреть возможность использования BigDecimal вместо этого, если вы имеете дело с очень широким диапазоном.

РЕДАКТИРОВАТЬ: Есть лучшие способы приблизиться к этому - используя DecimalFormat, вы сможете получить его только для опционально для получения десятичной точки.Например:

import java.text.*;

public class Test
{
    public static void main(String[] args)
    {
        DecimalFormat df = new DecimalFormat("0.###");

        double[] values = { 1.0, 3.5, 123.4567, 10.0 };

        for (double value : values)
        {
            System.out.println(df.format(value));
        }
    }
}

Вывод:

1
3.5
123.457
10
3 голосов
/ 04 июня 2018

Еще одно простое и интуитивно понятное решение с использованием оператора модуля (%)

if (x % 1 == 0)  // true: it's an integer, false: it's not an integer
0 голосов
/ 04 сентября 2011

Я программист на C #, поэтому я проверял это в .Net. Это должно работать и в Java (кроме строк, которые используют класс Console для отображения вывода.

class Program
{
    static void Main(string[] args)
    {
        double[] values = { 1.0, 3.5, 123.4567, 10.0, 1.0000000003 };
        int num = 0;
        for (int i = 0; i < values.Length; i++ )
        {
            num = (int) values[i];
            // compare the difference against a very small number to handle 
            // issues due floating point processor
            if (Math.Abs(values[i] - (double) num) < 0.00000000001)
            {
                Console.WriteLine(num);
            }
            else // print as double
            {
                Console.WriteLine(values[i]);
            }
        }
        Console.Read();
    }
}
...