Schnellste effizienteste Weg Dezimalwert um zu bestimmen, ist eine ganze Zahl in Java
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?
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.