Floating point 58.85显示为58.849999999

Floating point 58.85显示为58.849999999,floating-point,decimal,calculator,abap,Floating Point,Decimal,Calculator,Abap,我正在用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 MET

我正在用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.
方法生成\u NUM。
数据:lv_digi类型I.*小数点后的位数
调用方法me->get\u decimal
接收
getdigits=lv_digi。
*如果它是一个自然数
如果lv_digi=0。
如果thisnum<0。
结果=thisnum*10-新数字。
其他的
结果=thisnum*10+新数字。
恩迪夫。
*如果是浮点数
其他的
如果thisnum<0。
结果=这个数字-(新数字/10**lv_digi)。
其他的
结果=thisnum+(新数字/10**lv_digi)。
恩迪夫。
*将小数点的数目增加1
调用方法me->set\u decimal。
恩迪夫。
endmethod。
我基本上做的是每次点击一个数字,它就会调用“generate_num”方法。 它将THISNUM、NEWDIGIT和RESULT作为参数。
thisnum=当前编号(例如:58.8)
newdigit=单击的数字(例如:5)

结果=生成的数字(预期为:58.85,但返回58.849999)。

如果需要具有固定精度的十进制数字,则应使用类型p(压缩数)而不是浮点

例如:

DATA lv_fixed_point TYPE p LENGTH 16 DECIMALS 2.
这将创建一个定点变量,该点后有两位数字。“长度”参数的确切含义并不是那么简单。从:

包装编号-p型

类型p数据允许小数点后的数字。人数 小数位数是通用的,在程序中确定。价值 类型P数据的范围取决于其大小和位数 小数点后。有效大小可以是1到16之间的任意值 字节。两个十进制数字压缩为一个字节,而最后一个 字节包含一个数字和符号。最多允许14位数字 小数点后。初始值为零。当与 键入P数据,最好将程序属性设置为固定 点运算。否则,类型P数字被视为整数

对于距离、权重、数量等值,可以使用类型p数据 钱等等


或者您可以调用
调用函数“FLOATINGPOINT\u COMPARE\u ABSOLUTE”
来计算IEEE浮点ε中的因子。使用浮点运算时,实际上应该避免直接使用比较,并使用内置的epsilons编写自己的比较:

 IS_EQUAL
 IS_GREATER
 IS_GREATER_EQUAL
 IS_LESS
 IS_LESS_EQUAL
是最低限度的

更多的阅读

学习它。活下去。我喜欢


作为一个非常重要的练习,您还可以阅读
NaN
+Inf
-Inf
(如果您使用其他
DECFLOAT
类型而不是
f
,也可以阅读sNAN).

如果您能说明在何处以及如何解决此问题,将非常有帮助。这是一个常见的问题,需要很长的解释。我会让其他人介入或找到一个合适的副本来关闭。只需将类型更改为p就解决了我的问题。非常感谢。但是打包可以是最理想的解决方案(但速度没有那么快,因为它们仍然被解释为CHAR),而且需要最少的障碍。