为什么 SAS 中的 DO WHILE 和 DO UNTIL 在循环应该停止后再次执行循环体?

Why DO WHILE and DO UNTIL in SAS execute the loop body one more time after the loop should be stopped?

问题 1: 对于DO WHILE,我写下了以下代码:

data do_while;
a = 0;
do while (a<1);
    a = a+0.1;
    output;
end;
run;

SAS 给了我这个: result of do_while

不明白为什么输出1.1。当 a = 1 时循环不应该停止吗?

问题 2: 对于DO UNTIL,我写下了以下内容:

data do_until;
b=0;
do until (b>=1);
    b=b+0.1;
    output;
end;
run;

SAS 给了我这个:result of do_until

我理解 DO WHILE 循环在执行循环体之前检查条件,而 DO UNTIL 循环执行循环体然后检查条件。

当b=0.9时,SAS执行b=b+0.1(现在b=1)并输出。然后 SAS 检查条件 b>=1 是否为真,因此循环应该停止。但是为什么还是输出1.1呢?

您是正确的,因为 do while 条件是在进入循环时求值的,而 do until 是在循环结束时求值的。

问题可能归结为实数的数字表示。

在内部,当以 0.1 递增十次时,您最终得到的值可能略小于 1(例如 0.999999999989)。

将您的条件更改为

do while (round(a,0.1) < 1)

输出语句位置错误

data do_while;
   a = 0;
   do while (a<1);
      output;
      a = a+0.1;
      end;
   run;