我正在尝试强制BigDecimal使用符号(例如,而不是Decimal.multiply,do Decimal *),因为此问题涉及大量括号。
你能告诉我是否有办法在BigDecimal上使用符号而不将其转换为Double或其他东西?或者你可以将t转换为像term这样的格式吗?
double t = ((1.00 / f1) * ((((4.00 / (ak1 + 1.00)) - (2.00 / (ak1 + 4.00))) - (1.00 / (ak1 + 5.00))) - (1 / (ak1 + 6.00))));
格式为
term = ((one.divide(f,mc)).multiply(((((four.divide((ak.add(one)),mc)).subtract((two.divide((ak.add(four)),mc)))).subtract((one.divide((ak.add(five)),mc)))).subtract((one.divide((ak.add(six)),mc))))));
我已经尝试过很多次录音了,并花了将近6个小时试图找出BigDecimal出错的地方。
答案 0 :(得分:4)
没有。 Unfortunately Java不支持运算符重载。您别无选择,只能在BigDecimal
上使用这些方法。
答案 1 :(得分:3)
不。由于Java中没有运算符重载。
为了让自己更简单,可以将方程式分成几部分,并将这些位复杂或重复几次。将计算分解为这些部分,甚至编写辅助方法来帮助您计算总和。如果您将整个计算部分编写,那么每个部分都更容易测试。
例如
import static java.math.BigDecimal.ONE;
public class Sum {
private static final TWO = new BigDecimal("2");
private static final FOUR = new BigDecimal("4");
private static final FIVE = new BigDecimal("5");
private static final SIX = new BigDecimal("6");
private BigDecimal f;
private BigDecimal ak;
private MathContext mc;
public Sum(BigDecimal f, BigDecimal ak, MathContext mc) {
this.f = f;
this.ak = ak;
this.mc = mc;
}
public BigDecimal calculate() {
return inverse(f).multiply(
firstSubtractRest(
xOverYPlusZ(FOUR, ak, ONE),
xOverYPlusZ(TWO, ak, FOUR),
xOverYPlusZ(ONE, ak, FIVE),
xOverYPlusZ(ONE, ak, SIX),
));
}
private BigDecimal inverse(BigDecimal x) {
return ONE.divide(x, mc);
}
/* returns x / (y + z) */
private BigDecimal xOverYPlusZ(BigDecimal x, BigDecimal y, BigDecimal z) {
BigDecimal divisor = y.add(z);
return x.divide(divisor, mc);
}
private BigDecimal firstSubtractRest(BigDecimal... values) {
BigDecimal value = values[0];
for (int i = 1; i < values.length; i++) {
value = value.subtract(values[i]);
}
return value;
}
}
答案 2 :(得分:2)
您可以编写一个简单的解析器来构建表达式,然后使用Rhino或Java代码中可用的其他脚本引擎对其进行评估。
答案 3 :(得分:1)
不是先反转f1,而是将表达式放在最后。
double t = (4 / (ak1 + 1) - 2 / (ak1 + 4) - 1 / (ak1 + 5) - 1 / (ak1 + 6)) / f1;
您确定需要BigDecimal提供的准确性吗?即你需要超过15位数的精度。
double f1 = 1;
double ak1 = 1;
double t = (4 / (ak1 + 1) - 2 / (ak1 + 4) - 1 / (ak1 + 5) - 1 / (ak1 + 6)) / f1;
System.out.println(t);
System.out.println(new Sum(BigDecimal.ONE, BigDecimal.ONE, MathContext.DECIMAL64).calculate());
System.out.println(new Sum(BigDecimal.ONE, BigDecimal.ONE, MathContext.DECIMAL128).calculate());
打印
1.2904761904761906
1.2904761904761904
1.2904761904761904761904761904761904
如果您需要超过15位的准确度,则需要BigDecimal。但是,如果您尝试简化代码并且不需要那么精确,我会使用double
。