2

AGE として新しい変数を作成しています。CUTOFF 値は 100 で、それを 12 で割ると、値は正確に 8.3333 になります.....しかし、いくつかの鮮度値は 8.3333333 です。FRESHNESS>= 100/12 の場合、SEGMENT の値を選択する必要がありますが、鮮度が 8.3333 の AMU を選択する必要があります... FRESHNESS の形式は F12.9 で、CUTOFF は BEST12 です。

  data new;
    set SEGMENT_AGE;
    IF Freshness< CUTOFF/12 THEN AGE=AMU;
                         ELSE AGE=SEGMENT;
    RUN;

F12.9 にカットオフする別のフォーマットで試しましたが、まだ機能していません

4

1 に答える 1

1

浮動小数点の精度の問題が発生しています。数値が 10 進数の繰り返し (2 進数) である場合、どのように到達したかによって、2 つの異なる値 (高い方または低い方 - つまり、0.333333333333333333 または 0.333333333333333333334) になる可能性があります。いいえ:

1-(1/3) - (1/3) = 0.33333333333333333334
0+(1/3)         = 0.33333333333333333333

したがって、そうであるように見えるからといって、正確に等しいと仮定しないでください。さらに、小数を繰り返さない 10 進数の一部の数値は、2 進数で繰り返します。たとえば、7/10 は 0.7 10 進数ですが、2 進数で正確に格納することはできません。

正確に比較する必要がある場合は、丸めた数値を比較する必要があります。例えば、

if round(freshness,0.001) < round(cutoff/12,0.001) ...

期待に一致する計算が得られるはずです。

于 2013-10-22T13:42:10.077 に答える