Si vous avez une forte suspicion que le DOUBLE est en fait une longue et que vous voulez
1) obtenir une poignée sur sa valeur EXACT comme LONG
2) lancer une erreur lors de ne est pas un lONG
vous pouvez essayer quelque chose comme ceci:
public class NumberUtils {
/**
* Convert a {@link Double} to a {@link Long}.
* Method is for {@link Double}s that are actually {@link Long}s and we just
* want to get a handle on it as one.
*/
public static long getDoubleAsLong(double specifiedNumber) {
Assert.isTrue(NumberUtils.isWhole(specifiedNumber));
Assert.isTrue(specifiedNumber <= Long.MAX_VALUE && specifiedNumber >= Long.MIN_VALUE);
// we already know its whole and in the Long range
return Double.valueOf(specifiedNumber).longValue();
}
public static boolean isWhole(double specifiedNumber) {
// http://stackoverflow.com/questions/15963895/how-to-check-if-a-double-value-has-no-decimal-part
return (specifiedNumber % 1 == 0);
}
}
long est un sous-ensemble de double, de sorte que vous pourrait obtenir des résultats étranges si vous essayez sans le savoir pour convertir un double qui est en dehors de la gamme Long:
@Test
public void test() throws Exception {
// Confirm that LONG is a subset of DOUBLE, so numbers outside of the range can be problematic
Assert.isTrue(Long.MAX_VALUE < Double.MAX_VALUE);
Assert.isTrue(Long.MIN_VALUE > -Double.MAX_VALUE); // Not Double.MIN_VALUE => read the Javadocs, Double.MIN_VALUE is the smallest POSITIVE double, not the bottom of the range of values that Double can possible be
// Double.longValue() failure due to being out of range => results are the same even though I minus ten
System.out.println("Double.valueOf(Double.MAX_VALUE).longValue(): " + Double.valueOf(Double.MAX_VALUE).longValue());
System.out.println("Double.valueOf(Double.MAX_VALUE - 10).longValue(): " + Double.valueOf(Double.MAX_VALUE - 10).longValue());
// casting failure due to being out of range => results are the same even though I minus ten
System.out.println("(long) Double.valueOf(Double.MAX_VALUE): " + (long) Double.valueOf(Double.MAX_VALUE).doubleValue());
System.out.println("(long) Double.valueOf(Double.MAX_VALUE - 10).longValue(): " + (long) Double.valueOf(Double.MAX_VALUE - 10).doubleValue());
}
assurez-vous de ne pas disponible avec les doubles plus de 2^54 ou numéros ne rentrent pas dans la [fraction] (http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.3), par exemple des expressions comme 'myLong == (long) (myDouble + 1)' où ' myLong' équivaut à 'myDouble' va évaluer' true' –
Cette méthode ('Double.longValue();') est toujours utile si vous avez des valeurs doubles à partir de choses comme un arraylist comme ceci 'ArrayList' puisque vous aurez un ne peut pas lancer d'erreur. Je dis juste ceci pour n'importe qui qui est venu ici et a eu un problème légèrement différent. –
SARose
Votre titre "double to long conversion" n'est pas correct, votre question nécessite un titre "long to double conversion". –