2013-04-12 13 views
39

Mam podwójną wartość, którą muszę wyświetlić w moim interfejsie użytkownika. Warunkiem jest, że dziesiętna wartość double = 0 np. - 14.0 W tym przypadku muszę pokazać tylko 14 w moim interfejsie użytkownika. Maksymalny limit dla znaków wynosi tutaj 5.Jak sprawdzić, czy podwójna wartość nie ma części dziesiętnej

eg.- 12.34 Wartość całkowita nie może być większa niż 2 cyfry, a więc jest wartością dziesiętną dla naszego podwójnego.

Jaki może być najlepszy sposób na zrobienie tego?

Odpowiedz

129

Możesz po prostu zrobić to: d % 1 == 0, aby sprawdzić, czy niektóre double d jest w całości.

+4

to Double.MIN_VALUE% 1 == 0 daje fałsz –

+6

@Evgeniy Przecież 'Double.MIN_VALUE' nie jest w całości. –

+1

+1 Jesteś dobry –

2

Porównać dwie wartości: normalne podwójne i podwójne po floor. Jeśli mają tę samą wartość, nie ma elementu dziesiętnego.

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"); 
+1

Powinieneś prawdopodobnie użyje '! =' zamiast '>', ponieważ zwróci false dla ujemnych wartości 'd'. –

+0

nie działa z -11111111111111.1; –

+0

o tak, zaktualizowałem mój kod. Dzięki :) –

6

albo suficie i podłodze powinien dać takie same na zewnątrz umieścić

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

lub po prostu sprawdzić równości z podwójną wartość

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

lub

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

Co z '' 'Math.round (x) == x''' gdzie' '' x''' jest podwójnie wpisanym wyrażeniem. –

1

klawisze numeryczne formatter do sformatowania wartości, zgodnie z wymaganiami re. Proszę sprawdzić this.

7

Wszystkie liczby całkowite są modulo 1. Tak więc poniżej czeku należy podać odpowiedź.

if(d % 1 == 0) 
1

Prawdopodobnie chcesz zaokrąglić podwójny do 5 miejsc po przecinku lub tak przed porównaniem ponieważ podwójne mogą zawierać bardzo małe części dziesiętne jeśli masz zrobić kilka obliczeń z nim.

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 

Jeśli używasz C++ nie sądzę, jest okrągły funkcja, więc trzeba go wdrożyć się jak w: http://www.cplusplus.com/forum/general/4011/

0

Ciekawy mały problem. Jest to nieco trudne, ponieważ liczby rzeczywiste nie zawsze oznaczają dokładne liczby całkowite, nawet jeśli mają na to wpływ, więc ważne jest, aby pozwolić na tolerancję.

Na przykład tolerancja może wynosić 1E-6, w testach jednostkowych zachowałem dość grubą tolerancję na krótsze numery.

Żadna z odpowiedzi, które mogę czytać obecnie pracuje w ten sposób, więc tu jest moje rozwiązanie:

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

A testy jednostkowe, aby upewnić się, że działa:

@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)); 
} 
Powiązane problemy