Java 我能在没有任何舍入误差的情况下将长值精确地存储在双变量中吗?

Java 我能在没有任何舍入误差的情况下将长值精确地存储在双变量中吗?,java,Java,我编写了一个转换器,它使用Double.parseDouble将字符串转换为长值。因为用户有时以xx.xx格式而不是纯整数格式输入。使用Double.parseDouble解析长值时是否有可能丢失信息 static Long toLong(Object object) { if (object == null) { return null; } if (object instanceof Number) { return ((Number)

我编写了一个转换器,它使用Double.parseDouble将字符串转换为长值。因为用户有时以xx.xx格式而不是纯整数格式输入。使用Double.parseDouble解析长值时是否有可能丢失信息

static Long toLong(Object object) {
    if (object == null) {
        return null;
    }
    if (object instanceof Number) {
        return ((Number) object).longValue();
    }
    return new Double(Double.parseDouble(object.toString().trim())).longValue();
}
是的。
双精度
double
仅使用53位存储尾数–数字中的实际数字。
其他11位用于存储指数,其中十进制为


因此,您无法在
double

中精确表示64位数字,为什么不试试呢?输入一个长字符串,看看会发生什么。这样你也可以看到,有多少信息丢失了……是的,有。两者都使用64位。但是Double需要能够存储小数,而Long则不能。很明显,Double不能像long那样存储那么多精确的整数值。挑剔,但是:“指数–小数点在哪里”-由于二进制表示,指数表示二进制点在哪里,而不是小数点。这个答案中的“是”实际上回答了描述中的问题(“是否有可能丢失信息…?”),而不是标题中的问题(“我是否可以精确地存储长值…?”)。乍一看,我有点困惑。