Pergunta

Dada uma variável dupla nomeada sizeValue e sizeValue contém algo diferente de 0, qual é a maneira mais eficiente de determinar que sizeValue Contém um valor que é um número inteiro?

Atualmente estou usando

sizeValue % 1 == 0

Algum outro caminho mais rápido?

Foi útil?

Solução

experimentar Math.CEIL:

private static boolean isInt(double x) {
     return x == Math.ceil(x);
}

EDITAR

Eu fiz alguns benchmarks com os seguintes métodos:

private static boolean isInt1(double x) {
    return x == (int) x;
}

private static boolean isInt2(double x) {
    return x == Math.ceil(x);
}

private static boolean isInt3(double x) {
    return x % 1 == 0;
} 

isInt1 é o mais rápido deles (em um Sunjre 1.6)

Outras dicas

Não tenho certeza se é mais rápido, mas você pode lançar o seu dobro para um INT e testar a igualdade:

double d = 123.456;
boolean dIsAnInteger = (d == (int)d);

Aviso: você consideraria 0.9999999999999999 um número inteiro? Provavelmente não. Mas observe isso:

double val = 0;
for(int i=0;i<10;i++)
    System.out.println(val+=0.1);

Isso imprime:

0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999

O que é problemático porque no final do programa val Contém algo que você acha que deve ser inteiro, mas não é.

Então, eu tornaria meu método um pouco mais lento (mas mais correto), integrando um delta como Junit faz:

private static boolean isInt(double x, double delta) {
    double ceil = Math.ceil(x);
    return x-delta<ceil && x+delta>ceil;
}

E, é claro, forneça o mesmo método com um padrão sensato:

private static boolean isInt(double x) {
    return isInt(x, 0.000000001);
}

Agora isInt(val) finalmente retorna verdadeiro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top