web-dev-qa-db-ja.com

double値に小数部がないかどうかを確認する方法

UIに表示する必要がある二重の値があります。現在の条件は、doubleの10進数値= 0です。 -14.0その場合、UIに表示する必要があるのは14だけです。また、文字の最大制限はここでは5です。

例-12.34整数値は2桁以下であるため、doubleの10進数値も同じです。

これを行う最良の方法は何でしょうか?

67
Ankit

単にこれを行うことができます:d % 1 == 0は、いくつかのdouble dが完全かどうかを確認します。

190
Lone nebula
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");
19

すべての整数は1の法です。したがって、以下のチェックで答えが得られなければなりません。

if(d % 1 == 0)
11
Gokul Nath KP

天井と床のどちらも同じ出力を与える必要があります

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

または、単純にdouble値と等しいかどうかを確認します

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

または

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

2つの値を比較します。通常のdoubleと、flooringを実行した後のdoubleです。それらが同じ値である場合、小数部はありません。

2
Patashu

必要に応じて、数値フォーマッターを使用して値をフォーマットします。 this を確認してください。

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));
}
1
stivlo

Doubleを計算した場合、doubleには非常に小さな小数部分が含まれる可能性があるため、比較する前にdoubleを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/

1
Floaf