如何将一个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对象更有效率。