In Progress 4GL如何实现字符串转decimal的无损精度转换
问题根源
你遇到的精度丢失是两个原因共同导致的:
- 默认定义的
decimal类型变量仅保留2位小数,存储阶段就会截断超出的小数部分 display语句的默认格式仅展示2位小数,就算变量存储了更高精度也会在显示时被截断
解决方案
只要在定义decimal变量时显式指定精度,同时匹配对应显示格式即可,按你要求的保留7-8位精度的需求,实现代码如下:
define variable tinyChar as character initial "0.00000001" no-undo. /* 第一个参数16是总位数(整数位+小数位总和上限),第二个参数8是保留的小数位数 */ define variable tinyNum as decimal(16,8) no-undo. assign tinyNum = decimal(tinyChar). /* 显示时指定包含8位小数的格式,避免显示截断 */ display tinyNum format "->,>>>,>>9.99999999".
运行后会正常输出0.00000001。
补充说明
- 你可以根据实际需求调整小数位数,ABL的
decimal类型最多支持10位小数,完全覆盖7-8位的使用要求 - 如果不想每次显示都指定格式,也可以在定义变量时直接绑定格式:
后续直接调用define variable tinyNum as decimal(16,8) format "->,>>>,>>9.99999999" no-undo.display tinyNum即可正常显示完整精度。 - 数值计算时只要所有参与计算的
decimal变量都设置了足够的小数位,就不会出现中途精度丢失的问题。
内容的提问来源于stack exchange,提问作者Nicholas Womack
相关产品推荐
相关产品推荐

