在程序的属性中有一个默认勾选的设置,Fixed point arithmetic

ABAP固定点算术-LMLPHP

 定价例程VOFM所在的函数组是没有勾选的,所以例程中的计算要小心

ABAP固定点算术-LMLPHP

我们主要测试一下不勾选的情况。我们新建一个程序ytest_cl,注意不要勾选定点运算

DATA:l_kbetr TYPE p LENGTH 16 DECIMALS 14,     //积的小数位数根据两个乘数小数位相加而来,否则会导致小数点位置错位
     g_kbetr TYPE kbetr.
data:ls_komp type komp.

ls_komp-zzbtu = '3817580.000'.   //Decimal 15.3
ls_komp-zzbutp = '6.06881742100'. //Decimal 15.11

l_kbetr = ls_komp-zzbtu * ls_komp-zzbutp.
//上一句计算过程为,去掉小数点先做乘法3817580000*606881742100,等号赋值时再根据l_kbetr的小数位数来确定小数点位置
//由于l_kbetr定义了14个小数点,乘法结果从右往左14位确定小数点

//g_kbetr = l_kbetr.
//g_kbetr是带2位小数,直接赋值先把l_kbetr小数点去掉,再从右往左两位确定小数点,直接赋值会翻10的幂次倍甚至overflow,所以用下面函数

CALL  FUNCTION  'ROUND'
  EXPORTING
    decimals       = 2
    input          = l_kbetr
    sign           = 'X'
  IMPORTING
    output         = g_kbetr
  EXCEPTIONS
    input_invalid = 1
    overflow      = 2
    type_invalid  = 3
    OTHERS        = 4.

 然后再测试一下除法的情况

//上面只是乘法的情况,除法也是类似的思想:第一步去掉小数点做除法,第二步根据赋值目标确定小数点
DATA:l_kbetr TYPE p LENGTH 16 DECIMALS 8.    //商的小数位数 = 分子小数位 - 分母小数位
ls_komp-zzbtu = '10.000'.   //Decimal 15.3
ls_komp-zzbutp = '3.00000000000'. //Decimal 15.11

//l_kbetr = ls_komp-zzbtu / ls_komp-zzbutp. //分母小数位多,如果分子整数部分位数不够的话,第一步计算结果可能为0:例如本例
l_kbetr = ls_komp-zzbutp / ls_komp-zzbtu.
08-29 11:47