# 通用计算器 **Repository Path**: startgis/calculator ## Basic Information - **Project Name**: 通用计算器 - **Description**: 通用四则表达式计算器,使用BigDecimal实现计算,无精度丢失问题,支持自定义参数、自定义操作符、自定义函数,内置exp4j全部函数。MIT协议,免费商用 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2025-11-25 - **Last Updated**: 2025-11-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 通用计算器 #### 简介 - 基于BigDecimal的中缀表达式计算器,无精度丢失问题 - 内置了exp4j的全部操作符与函数 - 使用方便,结构简单,除junit外没有引用任何第三方包 - 支持参数替换计算 - 支持实时参数配置/查询 - 支持自定义操作符与函数 - 可以自定义任意长度参数列表的函数 - 可以自定义任意长度,任意嵌套的操作符 - 可以定义双目和单目操作符 - 可以覆盖已有的操作符和函数 - 完善的异常机制 - 打包后大小仅有29kb,适合小型项目使用。 ## 引入方式 ```xml cc.morz.pandora calculator 1.1.0 ``` ## 用法 参考单元测试类:```cc.morz.pandora.calculator.test.TestCalculate``` ```java /** * 简单计算 */ @Test public void test01() { BigDecimal res = Calculator.calculate("0.1+0.2"); assertEquals(res, new BigDecimal("0.3")); } /** * 复杂计算 */ @Test public void test02() { BigDecimal res = Calculator.calculate("-((901+2)*21-98*(31--23))"); assertEquals(res.compareTo(new BigDecimal(-13671)), 0); } /** * 函数计算 */ @Test public void test03() { BigDecimal res = Calculator.calculate("log2(4)+log10(1000)-20"); assertEquals(res.compareTo(new BigDecimal(-15)), 0); } /** * 条件判断 */ @Test public void test04() { BigDecimal resA = Calculator.calculate("2>1"); assertEquals(resA.compareTo(new BigDecimal(1)), 0); BigDecimal resB = Calculator.calculate("if(2>1,10,30)"); assertEquals(resB.compareTo(new BigDecimal(10)), 0); BigDecimal resC = Calculator.calculate("if(1>2,10,0.5*0.3)"); assertEquals(resC.compareTo(new BigDecimal("0.15")), 0); } /** * 参数计算 */ @Test public void test05() { DefaultParamHandler paramHandler = new DefaultParamHandler(); paramHandler.addParam("A", new BigDecimal(1)); paramHandler.addParam("B", new BigDecimal(2)); paramHandler.addParam("C", new BigDecimal(3)); BigDecimal res = Calculator.calculate("A+B--C", paramHandler); assertEquals(res.compareTo(new BigDecimal(6)), 0); } /** * 自定义函数及函数嵌套 */ @Test public void test06() { DefaultParamHandler paramHandler = new DefaultParamHandler(); paramHandler.addParam("A", new BigDecimal("0.1")); paramHandler.addParam("B", new BigDecimal("0.2")); Calculator cal = Calculator.newBuilder() .addFunction("t", (params) -> params[0].add(params[1])) .paramHandler(paramHandler) .build(); BigDecimal res = cal.execute("2-t(1+t(12*log10(1000),2+11),t(12*3,2+11)+3)+3*(A+B)"); assertEquals(res.compareTo(new BigDecimal("-99.1")), 0); } /** * 自定义运算符 */ @Test public void test07() { Calculator calculator = Calculator.newBuilder() .addOperator("飞", 400, OperatorType.BINARY, (params) -> params[0].subtract(params[1])) .build(); DefaultParamHandler paramHandler = new DefaultParamHandler(); paramHandler.addParam("大", new BigDecimal("1.5")); paramHandler.addParam("机", new BigDecimal("2.3")); paramHandler.addParam("啊", new BigDecimal("3.01")); paramHandler.addParam("~", new BigDecimal("4.3")); calculator.setParamHandler(paramHandler); BigDecimal res = calculator.execute("大飞机飞啊飞~"); assertEquals(res.compareTo(new BigDecimal("-8.11")), 0); } ``` 以上特性可以混合使用,满足各种需求。 有其他问题欢迎提issue~