检查计算结果是整数还是小数
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;
我尝试了一些在这里找到的解决方案,例如:
使用模运算符:
如果 ( n % 1 == 0 )
或使用 Math.ceil 和 floor 函数
但是当表达式结果的小数部分非常接近 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()
似乎工作正常。
我有这个公式
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;
我尝试了一些在这里找到的解决方案,例如:
使用模运算符: 如果 ( n % 1 == 0 )
或使用 Math.ceil 和 floor 函数
但是当表达式结果的小数部分非常接近 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()
似乎工作正常。