处理 SAS 中的舍入错误
Dealing with rounding errors in SAS
我正在开发一个大型数据应用程序,运行 出现了一个我似乎无法修复的舍入错误。代码基本上是这样的:
proc sql;
select round(amount,.01) - round(amount * (percentage/100),.01) as amount
from data;
quit;
我已经尝试了各种修复方法,但所有方法似乎都会导致其他方向的其他舍入错误突然出现。对于产生错误数量 = 56.45 和百分比 = 10 的行。我得到的结果等于 50.80,我希望结果等于 50.81。我不能接受舍入误差,因为有一个单独的过程可以逆转没有舍入误差的交易,最后逆转加上产生舍入误差的部分必须加起来为零。
我试过的代码:
select round((((100-percentage)/100)*amount), .01)
select round(amount,.01) - round(amount * (percentage/100),.001) as amount
第二个修复了问题,但在另一个方向产生了三个舍入误差。
非常感谢任何帮助。
谢谢。
在不知道您的数据类型的情况下,我不能肯定地说,但这里有一些更改应该有助于解决您的问题:
- 确保您使用的是十进制数据类型,而不是浮点数。
- 轮后你完成数学。您在两个代码片段中四舍五入计算的每个步骤,这很可能会产生不正确的结果。
- 请务必谨慎订购 operations/parentheses。例如,
100-percentage/100
的计算结果为 100-10/100
= 100-0.1
= 99.9
,我认为这不是您想要的。同样,您在该行上的右括号比左括号多一个。
我正在开发一个大型数据应用程序,运行 出现了一个我似乎无法修复的舍入错误。代码基本上是这样的:
proc sql;
select round(amount,.01) - round(amount * (percentage/100),.01) as amount
from data;
quit;
我已经尝试了各种修复方法,但所有方法似乎都会导致其他方向的其他舍入错误突然出现。对于产生错误数量 = 56.45 和百分比 = 10 的行。我得到的结果等于 50.80,我希望结果等于 50.81。我不能接受舍入误差,因为有一个单独的过程可以逆转没有舍入误差的交易,最后逆转加上产生舍入误差的部分必须加起来为零。
我试过的代码:
select round((((100-percentage)/100)*amount), .01)
select round(amount,.01) - round(amount * (percentage/100),.001) as amount
第二个修复了问题,但在另一个方向产生了三个舍入误差。
非常感谢任何帮助。
谢谢。
在不知道您的数据类型的情况下,我不能肯定地说,但这里有一些更改应该有助于解决您的问题:
- 确保您使用的是十进制数据类型,而不是浮点数。
- 轮后你完成数学。您在两个代码片段中四舍五入计算的每个步骤,这很可能会产生不正确的结果。
- 请务必谨慎订购 operations/parentheses。例如,
100-percentage/100
的计算结果为100-10/100
=100-0.1
=99.9
,我认为这不是您想要的。同样,您在该行上的右括号比左括号多一个。