Floating point 58.85显示为58.849999999
我正在用BSP构建一个计算器。 当我用各种数字测试它时,我遇到了一个问题,十进制数字不能正确显示 比如说。 58.85 -> 58.849999. 但是58.84或58.86工作得很好。 58.8471 -> 54.84710000000001. 最后,最后键入的数字将被无处保存 我的代码如下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
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),而且需要最少的障碍。