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做所有的运算,效果会更好。