developer tip

double 값에 소수점이 없는지 확인하는 방법

optionbox 2020. 11. 6. 08:05
반응형

double 값에 소수점이 없는지 확인하는 방법


이 질문에 이미 답변이 있습니다.

UI에 표시해야하는 이중 값이 있습니다. 이제 조건은 double = 0의 10 진수 값 예입니다. -14.0이 경우 UI에 14 개만 표시하면됩니다. 또한 여기에서 문자의 최대 제한은 5 자입니다.

예.-12.34 정수 값은 2 자리보다 클 수 없으며 double의 십진수 값도 마찬가지입니다.

이를 수행하는 가장 좋은 방법은 무엇입니까?


간단히 이렇게 할 수 있습니다. 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)

또는 단순히 이중 값과 같은지 확인하십시오.

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

또는

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

두 개의 값을 비교하십시오 : 일반 double과 floor그것을 한 후 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/ 에서 직접 구현해야합니다 .


재미있는 작은 문제. 실수가 의도 된 경우에도 항상 정확한 정수를 나타내는 것은 아니기 때문에 약간 까다 롭습니다. 따라서 허용 오차를 허용하는 것이 중요합니다.

예를 들어 허용 오차는 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));
}

참고 URL : https://stackoverflow.com/questions/15963895/how-to-check-if-a-double-value-has-no-decimal-part

반응형