当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在不进行转换的情况下将double转换为long?》经验,为你挑选了7个好方法。

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

例如:

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

Jon Skeet.. 242

假设您对截断为零感到满意,那么只需投射:

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

这比通过包装类更快 - 更重要的是,它更具可读性.现在,如果您需要舍入而不是"始终为零",则需要稍微复杂的代码.



1> Jon Skeet..:

假设您对截断为零感到满意,那么只需投射:

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

这比通过包装类更快 - 更重要的是,它更具可读性.现在,如果您需要舍入而不是"始终为零",则需要稍微复杂的代码.


很好的答案 - 朝向零部分本来应该是我的应用程序错误,所以掌声在你的答案中突出显示这一点,并提醒我的宿醉大脑在这里使用Math.round()而不仅仅是施法!

2> Johannes Sch..:

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

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


是的.它被认为是乔恩所说的补充:)
我喜欢这个,因为它也适用于Double和Long对象而不是原始类型.

3> 小智..:

首选方法应该是:

Double.valueOf(d).longValue()

从Double(Java Platform SE 7)文档:

Double.valueOf(d)

返回Double表示指定double值的实例.如果Double不需要新实例,则通常应优先使用此方法,而不是构造函数Double(double),因为此方法可能通过缓存频繁请求的值来显着提高空间和时间性能.



4> Michael Myer..:

(new Double(d)).longValue() 内部只做一个演员,所以没有理由创建一个Double对象.



5> Tyler 十三将士归玉..:

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

long DoubleMath.roundToLong(double x, RoundingMode mode)

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



6> NS du Toit..:

如果你强烈怀疑DOUBLE实际上是一个LONG,你想要

1)将其EXACT值作为LONG处理

2)当它不是LONG时抛出错误

你可以尝试这样的事情:

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



7> pvorb..:

你想要二进制转换吗?

double result = Double.longBitsToDouble(394.000d);

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有