Проверка, является ли результат вычисления целым или десятичным

У меня есть эта формула

Math.sqrt( 2 * Math.sqrt(m) + 1 / 4 ) - 1 / 2

в функции, где м является входом типа long,
Мне нужно проверить, является ли результат этого выражения целым числом или десятичным, вернуть результат, если это целое число, или вернуть -1, если он десятичный.
Итак, я решил поместить результат в double:

double n = Math.sqrt( 2 * Math.sqrt(m) + (double)1 / 4 ) - (double)1 / 2;

И я попробовал некоторые решения, которые я нашел здесь, как:

  • Использование оператора по модулю: if ( n % 1 == 0)

  • Или используя функции Math.ceil и floor

Но ни одна из них не работает, когда дробная часть результата выражения так близка к 1, что-то вроде.98999...
Например, когда m = 2084574945554272657, результат должен быть 53735,96813...
но оно округлено, и на самом деле то, что хранится в n, равно 53736.0, и ответом функции является то, что n является целым числом, что не является правильным.
Есть ли способ, которым я могу проверить результат правильно?

3 ответа

Решение

Если вам нужна точность, я бы предложил вам использовать BigDecimal, Он более требователен к процессору, поэтому вам нужно выбирать между производительностью и точностью.

    //Just an example, apply your formula here
    BigDecimal big = BigDecimal.valueOf(6.00);
    big = big.sqrt(MathContext.DECIMAL128);

    if (big.compareTo(big.setScale(0, RoundingMode.DOWN)) == 0) {
        return big.longValue();
    } else {
        return -1;
    }

По какой-то причине .equals() не делает трюк, но с .compareTo() кажется, работает нормально.

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

double toCheck = 277.76;
if((toCheck-(int)toCheck)!=0)
    System.out.println("decimal value");
else
    System.out.println("integer value);

При работе с переменными типа double рекомендуется использовать также двойные константы. Попробуйте добавить.0 в конце каждой константы, например 1.0, 4.0 и т. Д.

Другие вопросы по тегам