在程序的属性中有一个默认勾选的设置,Fixed point arithmetic
定价例程VOFM所在的函数组是没有勾选的,所以例程中的计算要小心
我们主要测试一下不勾选的情况。我们新建一个程序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.