Schnellste effizienteste Weg Dezimalwert um zu bestimmen, ist eine ganze Zahl in Java

StackOverflow https://stackoverflow.com/questions/1575052

  •  21-09-2019
  •  | 
  •  

Frage

Bei einer Doppel Variable mit dem Namen sizeValue und sizeValue enthält etwas anderes als 0, was der effizienteste Weg ist, dass sizeValue zu bestimmen, einen Wert enthält, eine ganze Zahl ist?

Zur Zeit bin ich mit

sizeValue% 1 == 0

andere Wege schneller?

War es hilfreich?

Lösung

gibt einen Versuch Math.ceil :

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

Bearbeiten

Ich habe einige Benchmarks mit den folgenden Methoden durchgeführt:

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 ist, desto schneller von ihnen (auf einem sunjre 1.6)

Andere Tipps

Ich bin nicht sicher, ob es schneller ist, aber man konnte Ihren Doppel in ein int und Test auf Gleichheit Stimmen:

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

Achtung: halte man eine ganze Zahl 0.9999999999999999? Wahrscheinlich nicht. Aber diese Uhr:

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

Diese druckt:

0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999

Welche denn am Ende des Programms val enthält etwas problematisch ist, dass Sie denken, sein integer sollte aber nicht ist.

So würde ich meine Methode ein wenig langsamer machen (aber richtig) durch ein Delta, wie die Integration von JUnit tut:

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

und natürlich die gleiche Methode mit einem vernünftigen Standard bieten:

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

Jetzt isInt(val) kehrt schließlich wahr.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top