Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查计算结果是整数还是小数_Java_Double_Long Integer_Rounding Error - Fatal编程技术网

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

Java 检查计算结果是整数还是小数,java,double,long-integer,rounding-error,Java,Double,Long Integer,Rounding Error,我有这个公式 Math.sqrt( 2 * Math.sqrt(m) + 1 / 4 ) - 1 / 2 在函数中,m是long类型的输入 我需要检查此表达式的结果是整数还是小数,如果是整数则返回结果,如果是小数则返回-1。 因此,我决定将结果放入一个双精度: double n = Math.sqrt( 2 * Math.sqrt(m) + (double)1 / 4 ) - (double)1 / 2; 我在这里找到了一些解决方案,比如: 使用模运算符: 如果(n%1==0) 或者使用M

我有这个公式

Math.sqrt( 2 * Math.sqrt(m) + 1 / 4 ) - 1 / 2
在函数中,m是
long
类型的输入
我需要检查此表达式的结果是整数还是小数,如果是整数则返回结果,如果是小数则返回-1。
因此,我决定将结果放入一个
双精度

double n = Math.sqrt( 2 * Math.sqrt(m) + (double)1 / 4 ) - (double)1 / 2;
我在这里找到了一些解决方案,比如:

  • 使用模运算符: 如果(n%1==0)

  • 或者使用Math.ceil和floor函数

但是当表达式结果的小数部分非常接近1时,它们都不起作用,比如.98999…
例如,当m=2084574945554272657时,结果应为53735.96813…
但是它是四舍五入的,实际上存储在n中的是53736.0,函数的答案是n是一个整数,这是不正确的。

有什么方法可以正确地检查结果吗?

在处理double类型的变量时,最好同时使用double常量。 尝试在每个常量的末尾添加.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()
似乎效果很好。

当分数部分很大时,再次失败。它将分数四舍五入为0。我是否应该将公式复制并粘贴到valueOf()方法中?此外,编译器还为sqrt()函数生成了一个错误,它不是为BigDecimal定义的。看来,
BigDecimal
.sqrt()
只是在Java 9中添加的。因此,如果切换到Java 9不是一个选项,您可以尝试使用这里描述的方法之一:不,您不应该只是复制该函数。如果你用BigDecimal做所有的运算,效果会更好。