问题:在使用
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基本类型对象转换原则
出去D
和T
这两个类型不可以被转换,其他都有相对应的转换规则的.
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.