2

long 是一个 64 位有符号二进制补码整数。Long 是 128 位有符号二进制补码整数吗?我只是想在继续之前确认这一点。

Long l = 6;
int i = 4;
Integer ii = 2;
l += (l/i) * ii;

我想知道我需要在哪里进行类型转换才能返回 3 而不是 2。

我尝试了以下方法:

l += (long) (((double) l/i) * ii);

当我使用 进行类型转换l/idouble,我会返回1,而不是1.5?

假设我要对 Long 进行类型转换,这是 Long 的最大数字,使用 (long),因为 long 是一个 64 位有符号二进制补码整数,会发生什么。

4

3 回答 3

4

long(小写)是原始类型的 64 位整数。Long(大写)是包装了long(小写)的引用类型(对象)。所以Long' 将他们的数据编码为 a long,因此也是 64 位的。如果您想要 > 64 位精度,请查看提供任意高精度的java.math.BigInteger 。

您的问题不是来自除法语句中的错误转换,而是来自long最后的转换:

l += (long) (((double) l/i) * ii);
       ^
       here

的结果(((double) l/i) * ii)double值为 3.0。由于浮点运算的特殊性,当它被强制转换为 a 时,它变为 2 long

为了解决这个问题,使用Math.round而不是类型转换:

 l += Math.round(((double) l/i) * ii);
于 2013-04-06T05:48:20.423 回答
0

Longlong是一个包含与原始对象相关的构造函数、方法和常量的类(例如,这将为您提供 a可以表示Long.MAX_VALUE的最大值)。long当您将 a 转换long为 aLong时,您正在从值类型转换为引用类型。用于表示值的位数不会改变。

于 2013-04-06T05:57:55.283 回答
0

你的(l/i) * ii意思是权力?如果是这样,也许你应该使用BigDecimal. 顺便说一句,1/i等于0;改为使用1.0/i

于 2013-04-06T05:53:56.530 回答