NutzCN Logo
问答 Nutz表达式引擎,怎么嵌套公式啊?
发布于 388天前 作者 qq_16dd5808 306 次浏览 复制 上一个帖子 下一个帖子
标签:

我有个综合能耗的公式,要先算出x这个算子,然后再套用公式,算出综合能耗,这里不会写了,
哪位大神帮帮忙?

    @Test
    public void t3() {
        double x = Double.parseDouble(new DecimalFormat("######0.00").format(Math.random() * 1.0 + 3.35));//第一个公式
        //综合能耗 = ((总里程/x)/0.89/总里程)*100
        Context context = Lang.context();
        context.set("totalMileage", new BigDecimal("10265.324"));
        El.eval(context, "((totalMileage/x)/0.89/totalMileage)*100");//第二个公式//综合能耗
    }
7 回复

好像不行,我先说一下我的业务场景。
spark在解析某个设备的时候
1.先去redis中查询当前设备,用于计算综合能耗的计算因子公式
···
有可能是
double x = Double.parseDouble(new DecimalFormat("######0.00").format(Math.random() * 1.0 + 3.35));
也有可能是
double x = Double.parseDouble(new DecimalFormat("######0.00").format(Math.random() * 1.0 + 4.5));
···
后面的3.35和4.5等等,这些也是变动的
2.通过公式计算出的x,在使用公式

综合能耗 = ((总里程/x)/0.89/总里程)*100

来计算最终要的值

如果写成一个公式也可以,就是有点长

((totalMileage/Double.parseDouble(new DecimalFormat("######0.00").format(Math.random() * 1.0 + 3.35)))/0.89/totalMileage)*100

totalMileage是我要传递的参数。其他都不变。

Context context = Lang.context();
context.set("totalMileage", new BigDecimal("10265.324"));
//综合能耗
El.eval(context, "((totalMileage/Double.parseDouble(new DecimalFormat("######0.00").format(Math.random() * 1.0 + 3.35)))/0.89/totalMileage)*100");

就是后面那个Double/DecimalFormat/Math这几个,不知道怎么弄了。

自定义method可以带参数哦,也就是公式里面的变量

不会写了,,,,

@Test
    public void t4() {
        BigDecimal x = new BigDecimal("3.35");
        BigDecimal totalMileage = new BigDecimal("10000");
        CustomMake.me().register("energy", new EnergyEl(x, totalMileage));
        //El.eval("((totalMileage/x)/0.89/totalMileage)*100");//综合能耗
    }
public class EnergyEl implements RunMethod, Plugin {
    BigDecimal x;
    BigDecimal totalMileage;

    public EnergyEl(BigDecimal x, BigDecimal totalMileage) {
        this.x = x;
        this.totalMileage = totalMileage;
    }

    @Override
    public Object run(List<Object> fetchParam) {
        return null;
    }

    @Override
    public String fetchSelf() {
        return null;
    }

    @Override
    public boolean canWork() {
        return true;
    }
}

行了,知道怎么弄了。

@Test
    public void t4() {
        BigDecimal x = new BigDecimal("3.35");
        BigDecimal totalMileage = new BigDecimal("10000");
        CustomMake.me().register("energy", new EnergyEl());
        Context context = Lang.context();
        context.set("x", x);
        context.set("totalMileage", totalMileage);
        BigDecimal energy = (BigDecimal) El.eval(context, "energy(x,totalMileage)");//综合能耗
        System.out.println(energy);
    }

我现在是这样做的。但是这样做,公式就隐藏在了我的自定义类中了,而不是放到redis的公式,违背了我最开始的要求。
想要把公式放到redis中,java代码直接拿来传参就使用。不知道怎么弄

@Test
    public void t4() {
        BigDecimal x1 = new BigDecimal("1.0");
        BigDecimal x2 = new BigDecimal("3.35");
        BigDecimal totalMileage = new BigDecimal("10000");
        CustomMake.me().register("energy", new EnergyEl());
        Context context = Lang.context();
        context.set("x1", x1);
        context.set("x2", x2);
        context.set("totalMileage", totalMileage);
        Double energy = (Double) El.eval(context, "energy(x1,x2,totalMileage)");//综合能耗
        System.out.println(energy);
    }
public class EnergyEl implements RunMethod, Plugin {
    DecimalFormat df = new DecimalFormat("######0.00");
    BigDecimal x1;
    BigDecimal x2;
    BigDecimal totalMileage;

    public EnergyEl() {
    }

    @Override
    public Object run(List<Object> fetchParam) {
        this.x1 = new BigDecimal(fetchParam.get(0).toString());
        this.x2 = new BigDecimal(fetchParam.get(1).toString());
        this.totalMileage = new BigDecimal(fetchParam.get(2).toString());

        //DecimalFormat df = new DecimalFormat("######0.00");
        //double x = Double.parseDouble(df.format(Math.random() * 1.0 + 3.35));//默认算子
        double x = Double.parseDouble(df.format(Math.random() * x1.doubleValue() + x2.doubleValue()));
        //((totalMileage/x)/0.89/totalMileage)*100
        //当日综合能耗 = ((当日行驶里程/x)/0.89/当日行驶里程)*100
        double d1 = NumberUtil.div(totalMileage.doubleValue(), x);// (当日行驶里程/x)
        double d2 = NumberUtil.div(d1, 0.89D);// (当日行驶里程/x)/0.89
        double d3 = NumberUtil.div(d2, totalMileage.doubleValue());// ((当日行驶里程/x)/0.89/当日行驶里程)
        double energy = NumberUtil.mul(d3, 100);// ((当日行驶里程/x)/0.89/当日行驶里程)*100
        return energy;
    }

    @Override
    public String fetchSelf() {
        return null;
    }

    @Override
    public boolean canWork() {
        return true;
    }
}
添加回复
请先登陆
回到顶部