首页 > 解决方案 > REDUCE 运算符中的小数位精度

问题描述

在下面的代码中,我声明了sumand lt_req-dmbtras dmbtr,但在输出中它没有显示十进制值,并且输出也比预期的少 2 或 3 个符号

DATA(total) = REDUCE dmbtr( INIT sum = 0  FOR wa IN lt_req WHERE ( gsber = <fs_ba_det>-gsber AND gjahr = 2020 ) NEXT sum = sum + conv dmbtr( wa-dmbtr )   ).

有时它会引发错误

CX_SY_ARITHMETIC_OVERFLOW

标签: mathabap

解决方案


sum变量类型在这里是限定的,而不是你wa-dmbtr转换的。

摘自REDUCE帮助:

INIT 之后的声明创建局部变量 x1, x2 ...

完整求值后,按照赋值规则将第一个变量x1的内容或第一个字段符号指向的内存区域 赋值给type类型表达式的临时结果

在您的代码段中,您sum的值为零,因此它是 Integer 并且它限制了所有其他类型。

满足您要求的REDUCE的正确形式:

TYPES:
  BEGIN OF ty_product,
    product TYPE char10,
    price   TYPE dmbtr,
    group   TYPE char10,
  END OF ty_product,
  tt_products TYPE STANDARD TABLE OF ty_product WITH EMPTY KEY.

DATA(t_prod) =
  VALUE tt_products(
    ( product = 'C0001' price = '1.005'     group = 'commodities' )
    ( product = 'C0002' price = '245.48575' group = 'crude' )
    ( product = 'C0003' price = '500.05'    group = 'crude' )
    ( product = 'C0004' price = '32'        group = 'commodities' )
  ).

DATA(total) = REDUCE dmbtr( INIT sum = CONV dmbtr( 0 ) FOR wa IN t_prod WHERE ( group = 'crude' ) NEXT sum = sum + wa-price ).

WRITE total.

结果将给出745.53575


推荐阅读