É possível fazer isso?
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
}
Eu sei o código provavelmente não vai qualquer coisa assim, mas como é que ele vai?
double
eint
são representados na memória de maneira diferente e você usaria um ou outro com base no contexto de seu tratamento de memória.Respostas:
Isso verifica se o valor arredondado do dobro é o mesmo que o dobro.
Sua variável pode ter um valor int ou duplo e
Math.floor(variable)
sempre possui um valor int; portanto, se sua variável for igual aMath.floor(variable)
, ela deverá ter um valor int.Isso também não funciona se o valor da variável for infinito ou infinito negativo, portanto, adicionando 'enquanto a variável não for inifinita' à condição.
fonte
int
se aif
avaliação é positivatrue
.Ou você pode usar o operador módulo:
(d % 1) == 0
fonte
Math.rint(d)
?d
em C e C ++.Goiaba:
DoubleMath.isMathematicalInteger
. (Divulgação: escrevi.) Ou, se você ainda não está importando o Guava,x == Math.rint(x)
é a maneira mais rápida de fazê-lo;rint
é mensurável mais rápido quefloor
ouceil
.fonte
fonte
Tente assim,
por exemplo:
portanto 12.9 não é inteiro, no entanto
portanto 12.0 é um número inteiro
fonte
Aqui está uma versão para
Integer
eDouble
:Para converter
Double
paraInteger
:fonte
Considerar:
Isso adere ao Java principal e evita uma comparação de igualdade entre valores de ponto flutuante (
==
) que são considerados ruins. OisFinite()
é necessário, poisrint()
passará através dos valores infinitos.fonte
A melhor maneira é com o operador de módulo
fonte
Aqui está uma boa solução:
fonte
(bool)
elenco?Semelhante à resposta do SkonJeet acima, mas o desempenho é melhor (pelo menos em java):
fonte
fonte
você pode tentar desta maneira: obter o valor inteiro do dobro, subtrair do valor duplo original, definir um intervalo de arredondamento e testar se o número absoluto do novo valor duplo (sem a parte inteira) for maior ou menor que o seu intervalo definido. se for menor, você pode pretender que seja um valor inteiro. Exemplo:
Se você atribuir a d o valor 33.15, o método retornará true. Para obter melhores resultados, você pode atribuir valores mais baixos a testRange (como 0,0002) a seu critério.
fonte
Pessoalmente, prefiro a solução simples de operação do módulo na resposta aceita. Infelizmente, o SonarQube não gosta de testes de igualdade com pontos flutuantes sem definir uma precisão redonda. Por isso, tentamos encontrar uma solução mais compatível. Aqui está:
Remainder(BigDecimal)
retorna umBigDecimal
cujo valor é(this % divisor)
. Se este for igual a zero, sabemos que não há ponto flutuante.fonte
Minha solução simples:
fonte
Aqui está uma solução:
fonte