【问题标题】:Why does int + BigDecimal not work?为什么 int + BigDecimal 不起作用?
【发布时间】:2014-09-11 02:37:03
【问题描述】:

我遇到了这个问题,我无法将整数添加到 BigDecimal。在代码中,我查看了错误,它说“二元运算符'+'的操作数类型错误”。如何将整数添加到 BigDecimal? (在代码中表示为 1 + sqf)

BigDecimal sqf = new BigDecimal(Math.sqrt(5));
sqf.setScale(100);
BigDecimal bd = new BigDecimal((1 + sqf) / 2); //Error here (1 + sqf)
bd.setScale(100);
System.out.println(isBuzzNumber(77707));
System.out.println(findHypotenuse(9, 10));
System.out.println("Phi (φ) = " + bd);

【问题讨论】:

  • 您为什么希望它起作用? Java 没有重载运算符。

标签: java


【解决方案1】:

BigDecimal bd = BigDecimal.ONE.add(sqf).divide(new BigDecimal(2))

标准运算符仅适用于基元。

【讨论】:

    【解决方案2】:
    1. Java 没有运算符重载,因此任何标准运算符都只适用于原始类型
    2. BigDecimal 不包含在自动装箱机制中,因为它没有原始类型表示
    3. 阅读BigDecimal API,它将数学运算符实现为方法(通常需要另一个BigDecimal 实例作为操作数。

    【讨论】:

      【解决方案3】:

      您必须以任何一种格式进行投射。 BigDecimal 是不可变的。

      例如

      sqf = sqf.add(new BigDecimal(1));
      

      您可以通过构造一个新的 BigDecimal 类来添加。

      【讨论】:

      【解决方案4】:

      数学符号 (+-*/) 仅适用于 Java 中的 String 和 primitive types
      BigDecimal 和 BigInteger 不是原始类型,因此不能直接对它们使用数学符号。
      当您想进行数学计算时,请考虑使用实例方法。

      【讨论】:

        【解决方案5】:

        您可以使用 the BigDecimal(int) constructor 从整数中创建 BigDecimal,如 new BigDecimal(1)BigDecimal.ONE(感谢 Herp Derpington)。

        与 Integer 和 Double 一样,`BigDecimal 实例是不可变的,这意味着任何一个 BigDecimal 实例都不会改变值,因此您可以共享或重用代表相同数字的实例。

        与 Integer 和 Double 不同,BigDecimal 不参与 自动装箱,这是从 int 原语到 Integer 对象实例的转换(同样跨其他类型)。在 Java 中,+/ 等运算符仅适用于原语;虽然你可以拨打sqf.add(BigDecimal.ONE),但没有办法使用+或拨打sqf.add(1)

        要对 BigDecimal 实例进行操作,您需要将自己限制在其方法(例如 adddivide)中,并传入 BigDecimal 实例(如果需要,是新创建的)。尤其是divide,它提供了许多方法重载,允许您选择对数字进行舍入或缩放的方式——这是其优于内置浮点除法的优势之一;如果遇到问题,您可能需要指定ROUND_TO_EVEN,它与the IEEE 754 behavior in the Java Language spec 最匹配。

        【讨论】:

        • 试过了,还是不行。我把 1 变成了一个 bigdecimal,它说的是同样的事情。帮忙?
        • 是的,因为您不能使用 / 划分 BigDecimal
        • 那我怎么分?我尝试使用 .divide 但它向我展示了完整的构造函数列表。
        • 更新答案:你不应该为divide指定任何其他参数,但如果你这样做,我建议ROUND_TO_EVEN
        【解决方案6】:

        您也可以像这样使用 BigDecimal 对象的 intvalue() 函数:

        BigDecimal bd = new BigDecimal((1 + sqf.intValue()) / 2);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-26
          • 2013-06-13
          • 2019-09-05
          • 1970-01-01
          相关资源
          最近更新 更多