为什么int + BigDecimal不起作用?

时间:2014-09-11 02:37:04

标签: java

我遇到了这个问题,就是我无法向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);

6 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

您必须使用其中一种格式进行投射。 BigDecimal是不可变的。

例如

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

您可以通过构建新的BigDecimal类来添加。

答案 2 :(得分:1)

  1. Java没有运算符重载,因此任何标准运算符仅适用于基本类型
  2. BigDecimal不包含在自动装箱机制中,因为它没有原始类型表示
  3. 读取BigDecimal API,它将数学运算符实现为方法(主要需要另一个BigDecimal实例作为操作数。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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

与Integer和Double不同,BigDecimal不参与 autoboxing ,这是从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

答案 5 :(得分:0)

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

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