代码之家  ›  专栏  ›  技术社区  ›  Ankit

如何检查双精度值是否没有小数部分[重复]

  •  96
  • Ankit  · 技术社区  · 12 年前

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

    例如-12.34整数值不能大于2位,我们的双精度小数也是如此。

    做这件事的最佳方法是什么?

    8 回复  |  直到 12 年前
        1
  •  285
  •   Roshana Pitigala Laxmansinghsodhanohdiyala    4 年前

    你可以简单地

    d % 1 == 0
    

    检查是否 double d 是一个整体。

        2
  •  25
  •   Subhrajyoti Majumder MGPJ    12 年前
    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");
    
        3
  •  13
  •   Gokul Nath KP    12 年前

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

    if(d % 1 == 0)
    
        4
  •  12
  •   Ankit    8 年前

    天花板和地板都应该有相同的输出

    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
    
        5
  •  2
  •   Patashu    12 年前

    比较两个值:正常的double和之后的double floor 如果它们是相同的值,就没有十进制成分。

        6
  •  1
  •   Floaf    12 年前

    在比较之前,您可能需要将double四舍五入到5位小数左右,因为如果您使用它进行了一些计算,则double可能包含非常小的小数部分。

    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
  •   stivlo    10 年前

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

    例如,容差可以是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));
    }
    
        8
  •  0
  •   Sudhanshu Umalkar    12 年前

    根据需要,使用数字格式化程序对值进行格式化。请检查 this .