SAP ABAP 基本运算(加减乘除取余 四舍五入 向上下取整) 问题:在使用`DIV`和 `/` 出现的差异以及错误

问题:在使用DIV/ 出现的差异以及错误

1.算术运算语句表

从下表我们可以看出DIV是整除,也就是他得出的结果都是整数,没有精确度;
/他就是简单的除法运算,含有精确度的.
在这里插入图片描述

2.问题剖析

下面这个l_data(p类型)是我们要计算的结果,ls_umrez-umrez / ls_umrez-umren(dec类型)这个结果业务理论上是不存在为零的情况的,但是bestand-labst(QUAN类型)是有可能存在为零的.

l_data = bestand-labst / ( ls_umrez-umrez / ls_umrez-umren ).
l_data = beatand-labst DIV ( ls_umrez-umrez DIV ls_umrez-umren ).

看下面的短文本就有了然了,我们在来看l_data的数据类型是p,这就不难理解了.
应为在使用DIV时底层数据会把所要计算的数据类型转换成结果的类型.
也就是你的计算结果是什么类型,底层就会把你的计算式子中的数据字段装换成什么类型,在进行计算.
在这里插入图片描述

3.类型转换

就是我们在进行数据对象进行赋值的时候就会触发底层的数据类型的转换,这种装换是系统自动的.例如将一个char类型的变量赋值给一个number类型的变量,只有数字字符被赋值,其他则直接被忽略.

3.1基本类型对象转换原则

出去DT这两个类型不可以被转换,其他都有相对应的转换规则的.

3.2引用类型对象和转换原则

对象应用和数据应用变量是不可以相互赋值的.
和C++中的指针原理是类似的.
引用类型对象赋值时只是将其包含的其他对象的地址指针进行传递,其指向的数据对象内容并不会进行任何转换或改变.
在对象引用变量之间的赋值时,赋值过程和结果会受应用变量的类型和其指向的数据对象的影响,可能存在强制类型转换.

3.3结构体转换原则

结构体在赋值时需要确定目标对象是扁平结构纵深结构.
纵深结构:需要考虑结构体之间完全的兼容性,因为纵深结构不存在任何数据类型转换.
扁平结构:可以不考虑结构体之间的兼容性

3.4内表转换原则

内表与内表之间的赋值时取决于内表的结构的兼容性,与表类型或者主键无关.

4.解决方案

我们在上面说过使用DIV会存在数据类型的转换问题,所以我们使用/进行计算.
我们在使用P类型运算时,如果程序属性中Fixed point arithmetic没有设置,则运算时小说位不会起作用,将按照整型处理.

1 / 3 * 3 

如果没有设置Fixed point arithmetic结果是为 0 的
因为除法结果被内部取整为 0 ,因此就会出现上面的报错问题; 如果设置了结果就为 1.

4.1Fixed point arithmetic(固定点算术)

SE38 选择程序属性把那个勾选主即可
在这里插入图片描述

5.四舍五入上下取整

 CALL FUNCTION 'ROUND'
          EXPORTING
            decimals      = 3          " 保留多少位小数
            input         = l_data     "输入数据
            sign          = 'X'        " X 四舍五入 + 向上取舍 - 向下取舍 (负数也一样)
          IMPORTING
            output        = l_data1    " 输出返回结果
          EXCEPTIONS
            input_invalid = 1
            overflow      = 2
            type_invalid  = 3
            OTHERS        = 4.
      ENDIF.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨天行舟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值