如何检查double值是否没有小数部分

时间:2013-04-12 05:42:52

标签: java double

我有一个双重值,我必须在我的UI上显示。 现在条件是double = 0的十进制值,例如。 - 14.0 在这种情况下,我必须在我的UI上只显示14个。 此外,字符的最大限制为5。

eg.- 12.34整数值不能大于2位数,因此是我们的double的十进制值。

这可能是最好的方法吗?

8 个答案:

答案 0 :(得分:177)

您可以执行此操作:d % 1 == 0查看某些double d是否完整。

答案 1 :(得分:16)

double d = 14.4;
if((d-(int)d)!=0)
    System.out.println("decimal value is there");
else
    System.out.println("decimal value is not there");

答案 2 :(得分:11)

所有整数都是1的模数。所以下面的检查必须给你答案。

if(d % 1 == 0)

答案 3 :(得分:7)

ceil和floor应该给出相同的输出

Math.ceil(x.y) == Math.floor(x.y)

或简单地用双值检查相等性

x.y == Math.ceil(x.y)
x.y == Math.floor(x.y)

Math.round(x.y) == x.y

答案 4 :(得分:2)

比较两个值:普通双精度值和floor之后的双精度值。如果它们是相同的值,则没有小数部分。

答案 5 :(得分:1)

根据需要使用数字格式化器格式化值。请检查this

答案 6 :(得分:1)

你可能想要在比较之前将双精度数舍入到5位小数左右,因为如果用它做了一些计算,双精度数可以包含非常小的小数部分。

double d = 10.0;
d /= 3.0; // d should be something like 3.3333333333333333333333...
d *= 3.0; // d is probably something like 9.9999999999999999999999...

// d should be 10.0 again but it is not, so you have to use rounding before comparing

d = myRound(d, 5); // d is something like 10.00000
if (fmod(d, 1.0) == 0)
  // No decimals
else
  // Decimals

如果您使用的是C ++,我认为没有圆函数,所以您必须自己实现它,如:http://www.cplusplus.com/forum/general/4011/

答案 7 :(得分:1)

有趣的小问题。这有点棘手,因为实数并不总是代表精确的整数,即使它们是有意的,所以允许容差也很重要。

例如,公差可能是1E-6,在单元测试中,我保持相当粗略的容差以获得更短的数字。

我现在可以阅读的答案都不是这样的,所以这是我的解决方案:

public boolean isInteger(double n, double tolerance) {
    double absN = Math.abs(n);
    return Math.abs(absN - Math.round(absN)) <= tolerance;
}

进行单元测试,以确保其有效:

@Test
public void checkIsInteger() {
    final double TOLERANCE = 1E-2;
    assertThat(solver.isInteger(1, TOLERANCE), is(true));

    assertThat(solver.isInteger(0.999, TOLERANCE), is(true));
    assertThat(solver.isInteger(0.9, TOLERANCE), is(false));

    assertThat(solver.isInteger(1.001, TOLERANCE), is(true));
    assertThat(solver.isInteger(1.1, TOLERANCE), is(false));

    assertThat(solver.isInteger(-1, TOLERANCE), is(true));

    assertThat(solver.isInteger(-0.999, TOLERANCE), is(true));
    assertThat(solver.isInteger(-0.9, TOLERANCE), is(false));

    assertThat(solver.isInteger(-1.001, TOLERANCE), is(true));        
    assertThat(solver.isInteger(-1.1, TOLERANCE), is(false));
}