5

私はBSPで計算機を構築しています。いろいろな数字でテストしてみると、10進数が正しく表示されないという問題がありました。

例えば。58.85->58.849999。しかし、58.84または58.86は問題なく機能します。58.8471->54.84710000000001。最後に、最後に入力した数字がどこからともなく保存されます。

以下の私のコード。

method GENERATE_NUM.

  DATA: lv_digi type I.  * number of digits after the decimal point


  call METHOD me->get_decimal
    RECEIVING
      getdigits = lv_digi.

  *if it is a natural number  
  IF lv_digi = 0.
    IF thisnum < 0.
      result = thisnum * 10 - newdigit.
    ELSE.
      result = thisnum * 10 + newdigit.
    ENDIF.

   *if it is a float number
   Else.
    IF thisnum < 0.
      result = thisnum - ( newdigit / 10 ** lv_digi ).
    ELSE.
      result = thisnum + ( newdigit / 10 ** lv_digi ).
    ENDIF.

    *increase the number of decimal point by 1
    call method me->set_decimal.
  ENDif.

endmethod.

私が基本的に行うことは、数字がクリックされるたびに、「generate_num」メソッドを呼び出すことです。パラメータとしてTHISNUM、NEWDIGIT、RESULTを取ります。
thisnum =現在の番号(例:58.8)
newdigit =クリックされた番号(例:5)
result =生成された番号(予想:58.85、ただし58.849999を返します)。

4

2 に答える 2

7

固定精度の10進数が必要な場合は、floatではなくタイプP(パック数)を使用する必要があります。

例:

DATA lv_fixed_point TYPE p LENGTH 16 DECIMALS 2.

これにより、ポイントの後に2桁の固定小数点変数が作成されます。「長さ」パラメータの正確な意味はそれほど単純ではありません。ドキュメントから:

パック番号-タイプP

タイプPデータでは、小数点以下の数字を使用できます。小数点以下の桁数は一般的なものであり、プログラムで決定されます。タイプPデータの値の範囲は、そのサイズと小数点以下の桁数によって異なります。有効なサイズは、1〜16バイトの任意の値にすることができます。10進数の2桁が1バイトにパックされ、最後のバイトには1桁と符号が含まれます。小数点以下14桁まで可能です。初期値はゼロです。タイプPデータを操作する場合は、プログラム属性の固定小数点演算を設定することをお勧めします。それ以外の場合、タイプPの数値は整数として扱われます。

タイプPのデータは、距離、重量、金額などの値に使用できます。

于 2012-09-13T09:14:03.143 に答える
0

CALL FUNCTION 'FLOATINGPOINT_COMPARE_ABSOLUTE'または、IEEEフロートイプシロンを考慮に入れるために呼び出すことができます。浮動小数点を使用する場合は、実際には比較を直接使用することを避け、組み込みのイプシロンを使用して独自に作成する必要があります。

 IS_EQUAL
 IS_GREATER
 IS_GREATER_EQUAL
 IS_LESS
 IS_LESS_EQUAL

最低限です。

浮動小数点について詳しくは、こちらをご覧ください。

勉強しなさい。それを生きる。大好きです。

自明ではない演習として、NaN +Infandを読むこともできます(代わりに他のタイプ-Infを使用している場合はsNANも参照してください)。DECFLOATf

于 2015-09-23T14:30:57.287 に答える