hujw 的来信 |
您好,我在使用QLExpress的时候,发现运算结果精度不符合预期结果。期盼得到您的解答。先列下具体问题:
运行表达式:a=(b-c)/(d-c)
其中:
b=new BigDecimal("0.1694915254237288"); c=new BigDecimal("0.15384615384615385"); d=new BigDecimal("1");
得到结果:a=0.01849
而我期望的结果是:a=0.01848998459167949
后者是通过BigDecimal手动运算得到的,RoundingMode=HALF_UP
疑问1:为什么QLExpress的返回结果的精度不是遵照BigDecimal的api描述的那样,精度和输入参数的精度、加减乘除方式等相关联。 疑问2:要想实现期望的结果,或者实现运算结果精度可控,有什么方法? |
回复如下:
你好,hjjw
谢谢你的咨询,我们也发现了一些源码的问题。
if(type == NumberType.NUMBER_TYPE_BIGDECIMAL) return new BigDecimal(op1.toString()).divide(new BigDecimal(op2.toString()));
应该改为:
if(type == NumberType.NUMBER_TYPE_BIGDECIMAL) return new BigDecimal(op1.toString()).divide(new BigDecimal(op2.toString()),BigDecimal.ROUND_HALF_UP);
单元测试:
@Test publicvoid testBigDecimalComputer() throws Exception { String expressString = "a=(b-c)/(d-c)"; ExpressRunner runner = new ExpressRunner(false,false); DefaultContext<String, Object> context = new DefaultContext<String, Object>(); context.put("b", new BigDecimal("0.1694915254237288")); context.put("c", new BigDecimal("0.15384615384615385")); context.put("d", new BigDecimal("1")); Object r = runner.execute(expressString, context, null, false, false); System.out.print("r="+r); } 返回结果:r=0.01848998459167949 |
接下来是两个问题:
1、因为QLExpress作为脚本语言,必须保持简洁性:a=(b-c)/(d-c),当然你可以可以按照标准java的写法使用bigdecimal
expressString = "a = (b.subtract(c)).divide(d.subtract(c), java.math.BigDecimal.ROUND_HALF_UP);"; 返回结果:r=0.01848998459167949 |
2、 参照问题1的回答
补充说明:其实QLExpress已经大量使用在后台结算系统,精度控制为RoundingMode=HALF_UP,scale=10
只要设置ExpressRunner的一个属性值即可。
/** * 是否需要高精度计算 */ privatebooleanisPrecise = false; |
@Test publicvoid testBigDecimalComputer() throws Exception { String expressString = "a=(b-c)/(d-c)"; ExpressRunner runner = new ExpressRunner(true,false); DefaultContext<String, Object> context = new DefaultContext<String, Object>(); context.put("b", new BigDecimal("0.1694915254237288")); context.put("c", new BigDecimal("0.15384615384615385")); context.put("d", new BigDecimal("1")); Object r2 = runner.execute(expressString, context, null, false, false); System.out.println("r="+r2);
} 返回结果:r=0.0184899846 |
相关推荐
9. **案例分析**:实际项目中的脚本应用示例,帮助读者理解脚本技术在不同场景下的具体应用。 通过阅读【脚本技术script56--2006】,读者可以系统地了解和掌握2006年前后的脚本技术全貌,为后续的脚本编程和系统...
BAT批处理脚本-数值计算-23个 BAT批处理脚本-文件相关操作-92个 BAT批处理脚本-文本操作-52个 BAT批处理脚本-格式转换-9个 BAT批处理脚本-清理-清除-垃圾-28个 BAT批处理脚本-系统设置查询修改-硬件相关-139个 BAT...
BAT批处理脚本-数值计算-23个 BAT批处理脚本-文件相关操作-92个 BAT批处理脚本-文本操作-52个 BAT批处理脚本-格式转换-9个 BAT批处理脚本-清理-清除-垃圾-28个 BAT批处理脚本-系统设置查询修改-硬件相关-139个 BAT...
BAT批处理脚本-数值计算-23个 BAT批处理脚本-文件相关操作-92个 BAT批处理脚本-文本操作-52个 BAT批处理脚本-格式转换-9个 BAT批处理脚本-清理-清除-垃圾-28个 BAT批处理脚本-系统设置查询修改-硬件相关-139个 BAT...
BAT批处理脚本-数值计算-23个 BAT批处理脚本-文件相关操作-92个 BAT批处理脚本-文本操作-52个 BAT批处理脚本-格式转换-9个 BAT批处理脚本-清理-清除-垃圾-28个 BAT批处理脚本-系统设置查询修改-硬件相关-139个 BAT...
BAT批处理脚本-数值计算-23个 BAT批处理脚本-文件相关操作-92个 BAT批处理脚本-文本操作-52个 BAT批处理脚本-格式转换-9个 BAT批处理脚本-清理-清除-垃圾-28个 BAT批处理脚本-系统设置查询修改-硬件相关-139个 BAT...
oracle里,汉字变成拼音的脚本。----品质保证oracle里,汉字变成拼音的脚本。----品质保证oracle里,汉字变成拼音的脚本。----品质保证oracle里,汉字变成拼音的脚本。----品质保证oracle里,汉字变成拼音的脚本。--...
简单明了的shell脚本语言讲义,让你轻松了解shell语言。
BAT批处理脚本-数值计算-23个 BAT批处理脚本-文件相关操作-92个 BAT批处理脚本-文本操作-52个 BAT批处理脚本-格式转换-9个 BAT批处理脚本-清理-清除-垃圾-28个 BAT批处理脚本-系统设置查询修改-硬件相关-139个 BAT...
BAT批处理脚本-数值计算-23个 BAT批处理脚本-文件相关操作-92个 BAT批处理脚本-文本操作-52个 BAT批处理脚本-格式转换-9个 BAT批处理脚本-清理-清除-垃圾-28个 BAT批处理脚本-系统设置查询修改-硬件相关-139个 BAT...
BAT批处理脚本-数值计算-23个 BAT批处理脚本-文件相关操作-92个 BAT批处理脚本-文本操作-52个 BAT批处理脚本-格式转换-9个 BAT批处理脚本-清理-清除-垃圾-28个 BAT批处理脚本-系统设置查询修改-硬件相关-139个 BAT...
obs-文本-脚本 date-and-time.lua
SSH免密登录脚本,免密登陆环境脚本------ssh_no_pass.sh,centos7,ssh秘钥
"游戏脚本-猩红收割者-弗拉基米尔2.zip"这个压缩包很可能包含了某个游戏——可能是电子游戏或者角色扮演游戏——中的角色“猩红收割者”(Vladimir)的相关脚本代码。弗拉基米尔这个名字通常与吸血鬼或暗黑角色相...
使用/ dev / usb / lp0设备句柄) 声称支持以下打印机(✓表示经过作者或贡献者验证的打印机): QL-500(✓),QL-550(✓),QL-560(✓),QL-570(✓),QL-580N,QL-650TD,QL-700(✓),QL-710W(✓), QL-...
由阿里的电商业务规则、表达式(布尔组合)、特殊数学公式计算(高精度)、语法分析、脚本二次定制等强需求而设计的一门动态脚本引擎解析工具。 在阿里集团有很强的影响力,同时为了自身不断优化、发扬开源贡献精神...
大麦抢票脚本 大麦抢票脚本|大麦-抢票|大麦抢票-脚本
奔梦向前:学编程其实很简单,html、css、JavaScript、html5、css3、vue、Canvas实现网页特效页面、新手入门学习、了解网页动画的制作、代码实现网页动态画面-表白代码脚本-2020-04-28-1。
**批处理**(Batch Scripting),是一种计算机编程语言,它允许用户创建一系列预定义命令的脚本文件,以实现自动化任务的执行。在Windows操作系统中,这种脚本通常被称为**批处理脚本**,其文件扩展名为`.bat`或`....
HW三网邻区脚本生成工具-移动-V13.xls