没有强制转换,将double转换为long的最佳方法是什么?
例如:
double d = 394.000;
long l = (new Double(d)).longValue();
System.out.println("double=" + d + ", long=" + l);
答案 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;