我有这个公式
Math.sqrt( 2 * Math.sqrt(m) + 1 / 4 ) - 1 / 2
在函数中,其中m是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是一个整数,这是不正确的。
有没有办法可以正确检查结果?
答案 0 :(得分:1)
试试这个:
double toCheck = 277.76;
if((toCheck-(int)toCheck)!=0)
System.out.println("decimal value");
else
System.out.println("integer value);
答案 1 :(得分:0)
如果您需要精确度,我建议您使用BigDecimal
。它在CPU方面要求更高,因此您需要在性能和精度之间进行选择。
//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()
似乎可以正常工作。
答案 2 :(得分:-1)
使用double类型的变量时,最好也使用double常量。 尝试在每个常量的末尾添加.0,如1.0,4.0等等