我正在计算这个正在进行的值31500 *(10/100)*(1/12)它给出262.49999但是在Windows的科学计算器中给出262.5 ...为什么这两个值之间存在差异?
答案 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中不能干净利落的计算。