Проверка, является ли результат вычисления целым или десятичным
У меня есть эта формула
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 и т. Д.