5

我正在用 BSP 构建一个计算器。当我用各种数字测试它时,我遇到了十进制数字无法正确显示的问题。

例如。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

当您想要具有固定精度的十进制数时,您应该使用类型 P(压缩数)而不是浮点数。

例子:

DATA lv_fixed_point TYPE p LENGTH 16 DECIMALS 2.

这将创建一个定点变量,点后有两位数。“长度”参数的确切含义并不那么简单。从文档中:

打包号码 - P 型

P 型数据允许小数点后有数字。小数位数是通用的,并在程序中确定。P型数据的取值范围取决于其大小和小数点后的位数。有效大小可以是 1 到 16 字节之间的任何值。两个十进制数字被打包成一个字节,而最后一个字节包含一个数字和符号。小数点后最多允许 14 位数字。初始值为零。处理 P 型数据时,最好设置程序属性 Fixed point algorithm。否则,P 型数字将被视为整数。

您可以将 P 型数据用于距离、重量、金额等值。

于 2012-09-13T09:14:03.143 回答
0

或者您可以调用CALL FUNCTION 'FLOATINGPOINT_COMPARE_ABSOLUTE'IEEE 浮点 epsilon 因子。使用浮点时,您实际上应该避免直接使用比较,并使用内置的 epsilon 编写自己的:

 IS_EQUAL
 IS_GREATER
 IS_GREATER_EQUAL
 IS_LESS
 IS_LESS_EQUAL

是最低限度的。

更多关于浮点的阅读在这里

学习它。活下去。爱它。

作为一项重要的练习,您还可以阅读NaN +Inf和(如果您使用其他类型而不是-InfsNAN,则还可以阅读)。DECFLOATf

于 2015-09-23T14:30:57.287 回答