检查计算结果是整数还是小数

Checking if the result of a calculation is an integer or a decimal

我有这个公式

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

在函数中,其中 m 是类型 long 的输入。
我需要检查这个表达式的结果是整数还是小数,return 如果是整数,结果是 return -1,如果是小数。
所以,我决定将结果放在 double 中:

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

我尝试了一些在这里找到的解决方案,例如:

但是当表达式结果的小数部分非常接近 1 时,它们中的 none 有效,例如 .98999...
例如当m = 2084574945554272657时,结果应该是53735.96813...
但它是四舍五入的,实际上存储在 n 中的是 53736.0,函数的答案是 n 是一个整数,这是不正确的。
有什么方法可以正确检查结果吗?

使用双精度类型的变量时,最好也使用双精度常量。 尝试在每个常量的末尾添加一个 .0,例如 1.0、4.0 等等

试试这个:

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

如果您需要精确度,我建议您使用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() 似乎工作正常。