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

时间:2017-10-26 14:05:43

标签: java double long-integer rounding-error

我有这个公式

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是一个整数,这是不正确的。
有没有办法可以正确检查结果?

3 个答案:

答案 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等等