UIに表示する必要がある二重の値があります。現在の条件は、doubleの10進数値= 0です。 -14.0その場合、UIに表示する必要があるのは14だけです。また、文字の最大制限はここでは5です。
例-12.34整数値は2桁以下であるため、doubleの10進数値も同じです。
これを行う最良の方法は何でしょうか?
単にこれを行うことができます:d % 1 == 0
は、いくつかのdouble d
が完全かどうかを確認します。
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");
すべての整数は1の法です。したがって、以下のチェックで答えが得られなければなりません。
if(d % 1 == 0)
天井と床のどちらも同じ出力を与える必要があります
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
2つの値を比較します。通常のdoubleと、floor
ingを実行した後のdoubleです。それらが同じ値である場合、小数部はありません。
必要に応じて、数値フォーマッターを使用して値をフォーマットします。 this を確認してください。
興味深い小さな問題。実数は必ずしも正確な整数を表すとは限らないため、多少の注意が必要です。したがって、許容値を許可することが重要です。
たとえば、許容値は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));
}
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/