如何将一个double转换为long而不用转换?

什么是最好的方式来转换一个双长到没有铸造?

例如:

double d = 394.000; long l = (new Double(d)).longValue(); System.out.println("double=" + d + ", long=" + l); 

假设你很高兴截断到零,只是施放:

 double d = 1234.56; long x = (long) d; // x = 1234 

这将比通过包装类更快 – 更重要的是,它更具可读性。 现在,如果你需要四舍五入而不是“总是趋于零”,你需要稍微复杂一些的代码。

…这是四舍五入的方式,不截断。 急于在Java API手册中查找:

 double d = 1234.56; long x = Math.round(d); 

(new Double(d)).longValue()内部只是一个(new Double(d)).longValue() ,所以没有理由创build一个Double对象。

番石榴math图书馆有一个特别的方法来devise一个双倍长的:

 long DoubleMath.roundToLong(double x, RoundingMode mode) 

您可以使用java.math.RoundingMode指定舍入行为。

首选方法应该是:

 Double.valueOf(d).longValue() 

从Double(Java Platform SE 7)文档 :

 Double.valueOf(d) 

返回一个Double实例,表示指定的double值。 如果不需要新的Double实例,通常应该优先使用此方法Double(double) ,因为此方法通过caching频繁请求的值可能会产生更好的空间和时间性能。

如果你有强烈的怀疑,这个DOUBLE实际上是一个LONG,而你想

1)把它的EXACT值作为一个LONG来处理

2)抛出一个错误,当它不是一个长

你可以尝试这样的事情:

 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是Double的一个子集,所以如果你在不知不觉中尝试转换Long范围之外的Double,你可能会得到一些奇怪的结果:

 @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()); } 

你想有一个像二进制转换

 double result = Double.longBitsToDouble(394.000d); 

简单地说,铸造比创buildDouble对象更有效率。