在十进制计算的情况下,进度4GL自动舍入

时间:2014-11-26 04:46:13

标签: progress-4gl openedge

我正在计算这个正在进行的值31500 *(10/100)*(1/12)它给出262.49999但是在Windows的科学计算器中给出262.5 ...为什么这两个值之间存在差异?

2 个答案:

答案 0 :(得分:4)

1/12 = 0.083333333333333333 ....

保留所有精确度的正确答案是262.499999999999999 ...

(如果你不信任电脑,你可以手工完成。)

这就是为什么许多计算,特别是那些涉及金钱的计算,将数字精确到一定的精度。

舍入与截断不同。在业务环境中,4gl ROUND(表达式,精度)函数通常是您想要的。

偶尔你确实需要TRUNCATE() - 但这在处理钱时很少见。更频繁的是需要CEILING()(又名“round up”),遗憾的是,4GL没有提供。但是,Stackoverflow有一个解决方案;)How to round up in progress programming

我已经失去了我看过自制舍入代码的次数,并且不得不解释为什么它没有做到作者所期望的。他们过去常常在学校教这些东西,但我想他们不再那样了?

科学应用中还有其他舍入规则。但由于这是一个进步-4gl标记的问题,我怀疑它们是相关的。

答案 1 :(得分:0)

您的计算器可能正在四舍五入。 (这是@ jensd的DISPLAY声明正在做的事情。请尝试使用MESSAGE。)您的计算器也可能存储超过九位小数的值(这是Openedge使用的)或具有特殊值舍入错误保护算法(Opennedge没有)。

有时问题是ABL执行整数运算,因为表达式中的值是整数;但这似乎并非如此。这只是一个在9dp中不能干净利落的计算。

相关问题