【问题标题】:Put and round function in SASSAS中的放置和舍入函数
【发布时间】:2019-06-07 06:57:01
【问题描述】:

在 SAS 中同时使用 round 函数和 put 函数时如何避免双重舍入?以如下代码为例:

data _null_;
  sd = 11.863499608;
  sdc = strip(put(round(sd,0.0001),10.3));
  put sdc=; 
run;

实际结果应为11.863,但put 函数从11.8635 的已舍入值向上舍入,得到最终结果11.864。 有人可以告诉我如何通过put 函数避免第二轮吗?请注意,第一个round 函数非常重要,不能回避。

【问题讨论】:

  • 您是否尝试将格式从 10.3 更改为 10.4?
  • 是的,我做到了,但我想要 3 个小数位。
  • 如果你只想要3个名额,为什么第一轮很重要?这里还有其他你没有提到的目标吗?只转一次。
  • 然后舍入到 0.001 而不是 0.0001。当逐位数字 0.4444444449 可以变为 1 时,这似乎不正确。
  • @KH_ 但你做得不对。对两者使用相同的精度。

标签: sas


【解决方案1】:

在某些情况下,Fw.d 格式未按预期进行舍入。最好在使用格式之前四舍五入到所需的数字和小数。

20   data _null_;
21      x=0-1e-5;
22      put x=best.;
23      y = put(x,5.2);
24      put y= 'Negative 0 need to round';
25      z = put(round(x,.01),5.2);
26      put z=;
27      run;

x=-0.00001
y=-0.00 Negative 0 need to round
z=0.00

【讨论】:

  • 我以前见过-0。还有什么惊喜吗?我运行了一个快速模拟,-0 是我看到的唯一区别。 data want ; call streaminit(123); do i=1 to 1e6; x=rand("normal") ; y=put(x,5.2) ; z=put(round(x,.01),5.2) ; if y ne z then output ; end ; run ;
  • 我已经看到了 OP 抱怨的结果,但只有汇总统计数据。我“总是”绕圈然后放。
  • 但在那种情况下,-0 比 0 更正确,而且 1e-5 应该是 +0,只有真正的零应该是 ±0。但是另一方面,当您无论如何都必须四舍五入时,请改用定点数学。所以不要计算 $ 使用 Cent 代替。使用 g 时不要使用 kg。问题是,将 thound 乘以 0.001 相加不会得到 1。现在从总和中减去 1 会留下一小部分,因为 0.001 不能以浮点格式表示。
【解决方案2】:

尝试使用:

sdc = strip(put(round(sd,0.001),10.3));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    相关资源
    最近更新 更多