如何在不进行转换的情况下将double转换为long?

时间:2008-11-26 17:44:52

标签: java type-conversion

没有强制转换,将double转换为long的最佳方法是什么?

例如:

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

9 个答案:

答案 0 :(得分:231)

假设你对截断为零感到满意,只需施放:

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

这比通过包装类更快 - 更重要的是,它更具可读性。现在,如果您需要除“始终为零”之外的舍入,您将需要稍微复杂的代码。

答案 1 :(得分:113)

......这是不会截断的舍入方式。匆匆在Java API手册中查找:

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

答案 2 :(得分:44)

首选方法应为:

Double.valueOf(d).longValue()

来自Double (Java Platform SE 7) documentation

Double.valueOf(d)
  

返回表示指定Double值的double实例。   如果不需要新的Double实例,则此方法应该   通常优先使用构造函数Double(double),   因为这种方法可能会产生明显更好的空间和时间   通过缓存经常请求的值来实现性能。

答案 3 :(得分:35)

(new Double(d)).longValue()内部只进行强制转换,因此没有理由创建Double对象。

答案 4 :(得分:11)

Guava Math库有一个专门用于将double转换为long的方法:

long DoubleMath.roundToLong(double x, RoundingMode mode)

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

答案 5 :(得分:7)

如果你强烈怀疑DOUBLE实际上很长,你想要

1)获取其EXACT值的句柄作为LONG

2)当它不是LONG

时抛出错误 你可以尝试这样的事情:

var keysArray: [String] = codiceValutaDict.keys

Long是Double的一个子集,所以如果你在不知不觉中尝试转换一个超出Long范围的Double,你可能会得到一些奇怪的结果:

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

答案 6 :(得分:5)

你想进行像

这样的二进制转换吗?
double result = Double.longBitsToDouble(394.000d);

答案 7 :(得分:0)

简单地说,强制转换比创建Double对象更有效。

答案 8 :(得分:0)

只需执行以下操作:

double d = 394.000;
long l = d * 1L;