【问题标题】:Typecasting Different Types into One Type将不同类型转换为一种类型
【发布时间】:2013-03-28 16:00:39
【问题描述】:

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

当我用double 输入l/i 时,我会返回1,而不是1.5

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

【问题讨论】:

  • 大小取决于您的编译器。使用 sizeof()。同时添加标签C,或C++
  • 它既不是 C 也不是 C++。我添加了一个 Java 标记。
  • @GrijeshChauhan sizeof 不是确定整数用来表示的值位数的准确方法,因为可能存在填充位。
  • @dalwh 你可以更改标签
  • @modifiablelvalue 是的,我也在评论 C/C++。 OP忘记添加语言标签了。

标签: java double type-conversion long-integer


【解决方案1】:

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

【讨论】:

  • 如果 long 和 Long 都是 64 位整数,除了 Long 自带的所有方法之外,还有理由使用 Long 吗?
  • Long 是一个引用类型,所以它可以用在很多原始类型不能用的地方。例如,在泛型中(例如 ArrayList<Long> 有效,但 ArrayList<long> 无效)。然而,在通常的实践中,它没有任何优势。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我正在考虑使用 BigDecimal 和 BigInteger,因为我需要能够保存 64 位正整数的东西。 BigDecimal 有多大?我还注意到他们在 String 中使用东西,所以我想知道哪个更好? - 将我使用的所有整数转换为 BigDecimal/BigInteger,让生活更简单 - 保留不同的类型(int、long、double 等)以节省资源
    • 正如 api 所说,BigInteger 提供任意精度的整数,它可以容纳任意大整数
    • 感谢您的确认。是不是更好?将我使用的所有整数转换为 BigDecimal/BigInteger 以简化生活或保留不同类型(int、long、double 等)以节省资源
    • 视情况而定。如果你的整数大于 64 位,除了使用 BigInteger,你别无选择,BigInteger 上的操作比原语上的操作更昂贵。
    • 如果你的整数没有机会超过64位,使用long,永远​​不要使用BigInteger。
    猜你喜欢
    • 2012-03-28
    • 2020-12-02
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    相关资源
    最近更新 更多