字符串类型数学运算精度丢失问题

67 阅读1分钟
  • 方式一:ScriptEngine

    会精度丢失,可执行连续双括号

  • 方式二:hutool ScriptUtil

    会精度丢失,可执行连续双括号

  • 方式三:hutool ScriptUtil

    会精度丢失,可执行连续双括号

  • 方式四: calculator.calculate

    不会精度丢失,且能执行双括号

    案例代码:

import cn.hutool.core.math.Calculator;
import cn.hutool.script.ScriptUtil;
​
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
​
/**
 * @ClassName Test
 * @Author lpj
 * @Date 2022/7/27 15:24
 **/
public class Test {
    public static void main(String[] args) {
        //自定义统计公式
        String evCode = "((a+b))+c";
        //根据变量获取真实值,替换未可执行真实值
        evCode = evCode.replace("a", "0.1");
        evCode = evCode.replace("b", "0.2");
        evCode = evCode.replace("c", "0.3");
        System.out.println("要执行的表达式为: " + evCode);
        //jdk自带执行方式,会精度丢失,可执行连续双括号
        try {
            ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");
            System.out.println("ScriptEngine执行结果: " + jse.eval(evCode));
        } catch (Exception e) {
            System.err.println("ScriptEngine执行出错,无法执行此表达式");
        }
        //hutool ScriptUtil工具,会精度丢失,可执行连续双括号
        try {
            System.out.println("ScriptUtil执行结果: " + ScriptUtil.eval(evCode));
        } catch (Exception e) {
            System.err.println("ScriptUtil执行此表达式出错,无法执行此表达式");
        }
        //hutool Calculator工具,不会精度丢失,但是无法执行双括号表达式,虽然不会这样写,但是在数学中是能计算的
        try {
            System.out.println("conversion执行结果:" + Calculator.conversion(evCode));
        } catch (Exception e) {
            System.err.println("conversion执行此表达式出错,无法执行此表达式");
        }
        //hutto Calculator工具,不会精度丢失,且能执行双括号
        try {
            Calculator calculator = new Calculator();
            System.out.println("calculate执行结果: " + calculator.calculate(evCode));
        } catch (Exception e) {
            System.err.println("calculate执行此表达式出错,无法执行此表达式");
        }
​
    }
}

测试结果 image.png