提问人:Giacomo Gaglione 提问时间:9/30/2022 更新时间:10/1/2022 访问量:410
SAS 四舍五入小数点后 2 位
SAS rounding half down 2 decimals
问:
干杯!
长话短说,我正在尝试处理 SAS 舍入函数和浮点精度。
基本上,我需要将一半四舍五入到小数点后两位,因此,即 1.235 应该四舍五入到 1.23 而不是 1.24
下面举个例子:
数 | desired_output |
---|---|
1.230 | 1.23 |
1.235 | 1.23 |
1.2355 | 1.24 |
1.2305 | 1.23 |
1.231 | 1.23 |
1.236 | 1.24 |
我尝试了很多方法都没有成功(即 round()、ceil()、floor() 和 rounde() 函数的几种组合),但是,为了复制练习,下面是一些测试:
data test;
input number desired_output;
datalines;
1.230 1.23
1.235 1.23
1.2355 1.24
1.2305 1.23
1.231 1.23
1.236 1.24
;
run;
data test;
set test;
round_01=round(number,.01);
round_ceil_01=ceil(round_01*100)/100;
round_floor_01=floor(round_01*100)/100;
round_even=rounde(number,.01);
less_half_rounding_factor=round(number-0.0005,.01);
run;
先谢谢你!
答:
1赞
Tom
9/30/2022
#1
怎么样:
round(number,0.01) - 0.01*(mod(number,0.01)=0.005)
当前一位正好为 0.01 时删除 5。
测试:让我们将数字生成到小数点后 5 位,并只保留 ROUND() 函数与上述“round_down”逻辑不同的数字。
data test;
do integer=1 to 100000 ;
number=integer/100000 ;
round=round(number,0.01);
round_down = round(number,0.01) - 0.01*(mod(number,0.01)=0.005);
if round ne round_down then output;
end;
run;
现在让我们检查一下它们中是否有任何一个是不同的,而不是那些 3 个最低有效小数位是 500 的,即 X.XX500 。
data test2;
set test;
where 500 ne mod(integer,1000) ;
run;
因此,有 100 种情况 ROUND 和 ROUND_DOWN 不同,它们都是值在千位中有 5 位,之后是零的情况。
0赞
Manojs
10/1/2022
#2
希望这是你要找的
data test;
set test;
value = input(put(number,4.2)best.);
run;
评论
0赞
Tom
10/1/2022
您想将 INFORMAT 与该 INPUT() 函数一起使用吗?BEST 是 FORMAT 的名称。请尝试。input(put(number,32.2),32.)
0赞
Tom
10/1/2022
这不会产生与发帖人已经尝试过的 round(number,0.01) 不同的任何结果。
评论