我一直试图编写一个给出一个double的函数isWhole
并查看它是否是一个整数,如果它返回没有小数的值(作为一个int? )否则返回3位小数(我可以用数字格式做这部分。
我的问题是如何检查double是否是整数,甚至是递归小数?
答案 0 :(得分:5)
[更新] 返回值 - 小数点后3位
public boolean isWhole(double value) {
return Math.floor(value) == value;
}
int
或double
double
转换为int
;只需类型转换: - int valueInt = (int) valueDouble;
答案 1 :(得分:2)
if(Math.abs(in-Math.floor(in)) < 0.001){
/* is whole number */
} else {
/* is not whole number */
}
实际上没有为双精度定义整数,因此可以将整数视为不会导致n.000
的数字。具体选择0.001
是因为它是预期的输出精度。
答案 2 :(得分:2)
我的第一个建议是:保持简单。 Java具有使这类事情变得简单的功能:
import java.Math;
public class MyFunctionsLibrary {
public static boolean isWhole(double x) {
if(x - Math.floor(x) == 0)
return true;
else
return false;
}
public static void testIt() {
double a = 123.456;
Integer whole = null;
Double nonWhole = null;
if(isWhole(a))
whole = new Integer(Math.floor(a));
else
nonWhole = new Double(a);
}
}
答案 3 :(得分:1)
这是我原来的答案:
怎么样
Math.floor(x)==x
如果它是一个数学整数(比如文档),那么地板会保持x不变,所以当没有任何东西可以舍入时,相等应该保持不变。
经过一番思考,我认为使用精确比较可能会导致不必要的结果。问题是,OP的要求到底是什么。是吗
如果是数学整数,则显示没有数字的数字 小数点后,如果不是,则显示3位数后 小数点。或者是
如果使用三位数格式化会在小数点后生成000,则只显示一个整数。
如果(1)是要求,上面和其他答案中显示的解决方案才有效,因为数字2.000001将变为2.000,因为它不是数学整数。
如果Locale固定为默认值,则为endsWith() - pattern格式化1.0当然可以优化为固定字符串,如“.000”或“,000”。
如果实际要求(2),我的预感是没有办法首先将数字格式化为字符串,然后才剥离零,如下所示:
String format(Locale l, double d) {
String zeros = String.format(l, "%.3f", 1.0d);
String s = String.format(l, "%.3f", d);
if (s.endsWith(zeros.substring(1))) {
return s.substring(0, s.length()-4);
}
return s;
}
答案 4 :(得分:-1)
要查看double是否为整数,请使用
double d;
int whole = (int) d;
if(whole == d){
return whole;
}
else{
(your formatting here)
return formattedDouble;
}
您可以通过创建:
来检查它是否是递归的 String s = d + "";
for(int i = 1; i < s.length(); i++){
if(s.charAt(i) == s.charAt(i-1)){
continue;
}
else{
return false;
}
}