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/i
对double
进行类型转换时,我会返回1
而不是1.5
?
让我们说我要对一个Long进行类型转换,这是Long的最大数字,有(长),会发生什么,因为long是一个64位带符号的二进制补码整数。
答案 0 :(得分:4)
long
(小写)是一个基本类型的64位整数。 Long
(大写)是包装long
(小写)的引用类型(对象)。因此Long
将数据编码为long
,因此也是64位。如果你想要> 64位精度,查看提供任意高精度的java.math.BigInteger。
您的问题不是来自部门声明中的错误投射,而是来自最后的演员long
:
l += (long) (((double) l/i) * ii);
^
here
(((double) l/i) * ii)
的结果是值为3.0的double
。由于浮点运算的特殊性,当它转换为long
时,它变为2。
要解决此问题,请使用Math.round
代替类型转换:
l += Math.round(((double) l/i) * ii);
答案 1 :(得分:0)
你的(l/i) * ii
意味着力量?如果是这样,也许你应该使用BigDecimal
。顺便说一句,1/i
等于0;请改用1.0/i
。
答案 2 :(得分:0)
Long
是一个包含与long
原始对象相关的构造函数,方法和常量的类(例如。Long.MAX_VALUE
,它将为您提供long
的最大值可以代表)。将long
转换为Long
时,您需要从值类型转换为引用类型。用于表示值的位数不会改变。