BigDecimal符号/括号

时间:2011-11-20 16:34:32

标签: java bigdecimal

我正在尝试强制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出错的地方。

4 个答案:

答案 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