我正在尝试编写一个小型java类。我有一个名为BigNumber的对象。我写了添加两个正数的方法,以及减去两个正数的其他方法。
现在我希望他们处理负数。所以我写了几个'if'语句,例如。
if (this.sign == 1 /* means '+' */) {
if (sn1.sign == 1) {
if (this.compare(sn1) == -1 /* means this < sn1 */ ) return sn1.add(this);
else return this.add(sn1);
}
等
不幸的是,代码看起来很难看。就像一堆if和elses一样。有没有更好的方法来编写这种代码?
修改
我不能只做this.add(sn1)
因为有时我想将正数添加到负数或否定为负数。但添加只能处理正数。所以我必须使用基本数学,例如:不是将负数添加到负数,而是将this.abs()
(数字的绝对值)添加到sn1.abs()
并以相反的符号返回结果。德鲁:这些行来自方法_add。我使用这种方法来决定如何处理它收到的数字。发送他们添加方法?或者将它们发送到subract方法,但顺序不同(sn1.subtract(this)
)?等等..
if (this.sign == 1) {
if (sn1.sign == 1) {
if (this.compare(sn1) == -1) return sn1.add(this);
else return this.add(sn1);
}
else if (wl1.sign == 0) return this;
else {
if (this.compare(sn1.abs()) == 1) return this.subtract(sn1.abs());
else if (this.compare(sn1.abs()) == 0) return new BigNumber(0);
else return sn1.abs().subtract(this).negate(); // return the number with opposite sign;
}
} else if (this.sign == 0) return sn1;
else {
if (wl1.sign == 1) {
if (this.abs().compare(sn1) == -1) return sn1.subtract(this.abs());
else if (this.abs().compare(sn1) == 0) return new BigNumber(0);
else return this.abs().subtract(sn1).negate();
} else if (sn1.sign == 0) return this;
else return (this.abs().add(wl1.abs())).negate();
}
正如你所看到的 - 这段代码看起来很可怕......
答案 0 :(得分:1)
您可以考虑使用二进制补码算法。这将大大简化加法和减法。无需担心符号位,只需将数字加在一起即可。
答案 1 :(得分:0)
这样的事情可能更具吸引力:
if (this.sign == 1 && sn1.sign == 1) {
return (this.compare(sn1) < 0) ? sn1.add(this) : this.add(sn1);
}
答案 2 :(得分:0)
我建议你花更多的方法;)这个怎么样:
if (isPositive() && other.isPositive()) {
if (this.isBiggerThen(other)) {
return this.plus(other);
} else {
return other.plus(this);
}
}
请注意,我将sn1重命名为other,将add
方法重命名为plus
以指示该方法返回总和以提高可读性。如果将某些内容添加到对象本身(如BigInteger类中),通常会使用add
。
isPositive和isBigger的实现非常简单:
private boolean isPositive() {
return sign == 1;
}
private boolean isBiggerThen(BigNumber other) {
return this.compare(other) > 0;
}
答案 3 :(得分:0)
有些事让我感到困惑。不应该添加是可交换的。即它应该给a + b和b + a给出相同的结果。
在大多数情况下,您只需确定符号是否相同即可添加绝对值。
e.g。
if (sign == sn1.sign)
return add(sn1);// add the absolute values and keep the sign. 1 + 1 == 2, -1 + -1 == -2
if (sign == 0) return sn1;
if (sn1.sign == 0) return this;
// you only need to know which value is larger for subtraction.
// keep the sign of the first argument and substract the absolute value.
return compare(sn1) > 0 ? substract(sn1) : sn1.substract(this);