Czy da się to zrobić?
double variable;
variable = 5;
/* the below should return true, since 5 is an int.
if variable were to equal 5.7, then it would return false. */
if(variable == int) {
//do stuff
}
Wiem, że kod prawdopodobnie nie działa w ten sposób, ale jak to działa ?
double
iint
są reprezentowane w pamięci w różny sposób, a używałbyś jednego lub drugiego w zależności od kontekstu, w jakim operujesz pamięcią.Odpowiedzi:
Sprawdza, czy zaokrąglona w dół wartość double jest taka sama jak double.
Twoja zmienna może mieć wartość int lub double i
Math.floor(variable)
zawsze mieć wartość int, więc jeśli zmienna jest równa,Math.floor(variable)
to musi mieć wartość int.To również nie działa, jeśli wartość zmiennej jest nieskończona lub ujemna nieskończona, dlatego do warunku dodaje się „tak długo, jak zmienna nie jest nieskończona”.
źródło
int
jeśliif
wartościtrue
.Lub możesz użyć operatora modulo:
(d % 1) == 0
źródło
Math.rint(d)
?d
w C i C ++.Guawa:
DoubleMath.isMathematicalInteger
. (Ujawnienie: napisałem to.) Lub, jeśli jeszcze nie importujesz guawy,x == Math.rint(x)
jest to najszybszy sposób na zrobienie tego;rint
jest mierzalnie szybszy niżfloor
lubceil
.źródło
źródło
Spróbuj w ten sposób
na przykład:
stąd 12,9 nie jest jednak liczbą całkowitą
stąd 12,0 jest liczbą całkowitą
źródło
Oto wersja dla
Integer
iDouble
:Aby przekonwertować
Double
naInteger
:źródło
Rozważać:
To trzyma się rdzenia Javy i pozwala uniknąć porównania równości między wartościami zmiennoprzecinkowymi (
==
), które są uważane za złe. JestisFinite()
to konieczne, podobnie jakrint()
wartości nieskończoności.źródło
Najlepszym sposobem jest użycie operatora modułu
źródło
Oto dobre rozwiązanie:
źródło
(bool)
obsada?Podobna do odpowiedzi SkonJeeta powyżej, ale wydajność jest lepsza (przynajmniej w Javie):
źródło
źródło
możesz spróbować w ten sposób: pobierz wartość całkowitą double, odejmij ją od pierwotnej wartości double, zdefiniuj zakres zaokrąglania i sprawdź, czy liczba bezwzględna nowej wartości double (bez części całkowitej) jest większa lub mniejsza niż twoja zdefiniowany zakres. jeśli jest mniejszy, możesz zamierzyć, że jest to wartość całkowita. Przykład:
Jeśli przypiszesz d wartość 33,15, metoda zwróci wartość true. Aby uzyskać lepsze wyniki, możesz według własnego uznania przypisać niższe wartości testRange (jako 0,0002).
źródło
Osobiście wolę proste rozwiązanie obsługi modulo w przyjętej odpowiedzi. Niestety SonarQube nie lubi testów równości z zmiennoprzecinkowymi bez ustawiania okrągłej precyzji. Dlatego staraliśmy się znaleźć bardziej zgodne rozwiązanie. Oto ona:
Remainder(BigDecimal)
zwraca a,BigDecimal
którego wartość to(this % divisor)
. Jeśli ta jest równa zero, wiemy, że nie ma zmiennoprzecinkowego.źródło
Moje proste rozwiązanie:
źródło
Oto rozwiązanie:
źródło