表达式引擎aviator执行BigDecimal类型计算的返回类型问题

项目中遇到一个BigDecimal的类型通过三目获取最终值,但是0没有事先转成BigDecimal的类型,强转接类型报错问题记录
	// 执行表达式
    public static Object executeStr(String expression, Map<String, Object> env) {
        Object object = null;
        try {
            object = AviatorEvaluator.execute(expression, env);
        }
        catch(Exception e) {
            throw new RuntimeException("规则解析发生异常,表达式:" + expression + ",异常:"+e.getMessage());
        }
        finally {
            return object;
        }
    }

	// 具体实现方法
    public static void main(String[] args) {
        String expression = "amount>0?amount*100:0";
        Map<String, Object> env = new HashMap<String, Object>();
        env.put("amount", new BigDecimal(2000));
        Object object1 = executeStr(expression, env);
        // 因为在aviator的返回类型会是传入的map的类型
        // 验证返回的amount类型,应该返回的原来amount的值
        if (object1 instanceof BigDecimal) {
            System.out.println("amount:" + env.get("amount") + ";返回的是:" + object1 + ",类型是BigDecimal");
        } else {
            System.out.println("amount:" + env.get("amount") + ";返回的是:" + object1 + ",类型是:" + object1.getClass());
        }
        // 验证返回的0类型
        env.put("amount", new BigDecimal(-2000));
        Object object2 = executeStr(expression, env);
        // 验证返回的amount类型,应该返回的是0
        if (object2 instanceof BigDecimal) {
            System.out.println("amount:" + env.get("amount") + ";返回的是:" + object2 + ",类型是BigDecimal");
        } else {
            System.out.println("amount:" + env.get("amount") + ";返回的是:" + object2 + ",类型是:" + object2.getClass());
        }
    }


	// 控制台输出结果
	amount:2000;返回的是:200000,类型是BigDecimal
	amount:-2000;返回的是:0,类型是:class java.lang.Long

总结:aviator执行返回的结果是原参数的类型,执行了*100返回的结果类型依然是原参数类型,但是如果直接定义返回的类型那么类型是自定义参数的类型,类似我取值就会出问题

	// 直接获取返回值
    public static void main(String[] args) {
        String expression = "amount>0?amount*100:0";
        Map<String, Object> env = new HashMap<String, Object>();
        env.put("amount", new BigDecimal(2000));
        Object object1 = executeStr(expression, env);
        // 可以直接接,但是如果是-2000会报错,需要注意自己转类型
		BigDecimal reObject = (BigDecimal )object1;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值