Abap数据类型P和F的使用

前言

ABAP 中的 P 类型和 F 类型是两种用于表示数值的数据类型,分别适用于不同的应用场景,各有其特性和优缺点。以下是 P 类型和 F 类型的详细说明:

P 类型(Packed Number)

定义与特性:
  • 压缩数值类型P 类型是一种压缩数值类型,特别适用于存储具有固定小数位数的数值,如金额、比例等,需要精确计算的场合。
  • 字节数和小数位数:定义 P 类型变量时,需要指定其总字节数(1到16字节)和小数位数。例如:DATA amount TYPE p LENGTH 16 DECIMALS 2 表示定义了一个16字节长、带两位小数的P类型变量。
  • 编码P 类型使用二进制编码的十进制(Binary-Coded Decimal, BCD)格式存储数据,每个数字字符占用固定的4位(半字节),因此每个字节可以存储两个数字字符。小数点则固定占用半个字节。
  • 精度高P 类型由于其BCD编码方式,能够在不引入舍入误差的情况下精确表示数值,尤其适合对精度要求高的金融计算。
优势与适用场景:
  • 精确计算:在需要进行精确数值计算(如金融交易、税率计算等)时,P 类型能确保计算结果的绝对精确,无舍入误差。
  • 防止累积误差:对于涉及大量数值计算且精度至关重要的系统,如财务、税务系统,使用 P 类型可以避免因浮点数计算导致的累积误差。
注意事项:
  • 空间效率:虽然 P 类型提供了高精度,但相对于其他数值类型(如 F 类型),其空间效率较低,相同数值范围可能需要更多存储空间。
  • 性能影响P 类型的计算通常比浮点数慢,因为其内部处理通常基于软件而非硬件浮点单元(FPU),这可能会影响大规模数值计算的性能。
  • 程序属性设置:为了确保 P 类型的正确计算,通常需要在程序属性中启用“Fixed Point Arithmetic”。

F 类型(Floating Point)

定义与特性:
  • 浮点数类型F 类型是一种浮点数类型,遵循IEEE 754标准或其他相应硬件平台的浮点数表示规则。
  • 动态范围与精度F 类型提供了较大的数值范围(如正负数的10^(-307)到10^(308)之间)和动态的精度(通常近似为15位十进制数,具体取决于硬件平台),适用于广泛且变化的数值范围。
  • 二进制表示F 类型的数值以二进制浮点格式存储,包含一个阶码(表示数值的大小)和一个尾数(表示数值的精度),这种表示方式可能导致舍入误差。
优势与适用场景:
  • 空间效率:相对于 P 类型,F 类型在表示大范围数值时通常更节省存储空间。
  • 计算速度:由于 F 类型的计算通常由硬件浮点单元直接支持,其计算速度较快,适用于高性能数值计算和科学计算。
  • 通用性:浮点数是大多数编程语言和计算机硬件广泛支持的标准类型,易于与其他系统或编程环境进行数据交换。
注意事项:
  • 精度损失F 类型在进行浮点数运算时可能出现舍入误差,不适用于对精度要求极高的场景,如精确金额计算。
  • 溢出风险:超出 F 类型表示范围的数值可能导致溢出错误,需要在程序中进行适当的检查和处理。

总结: P 类型和 F 类型在ABAP中分别用于不同的数值处理场景。P 类型提供精确的数值表示,适用于对精度要求极高且不允许舍入误差的金融、税务等业务场景,但可能占用更多存储空间且计算性能较低。相比之下,F 类型具有较大的数值范围、较高的计算效率和较好的空间利用率,适用于对精度要求相对宽松、数值范围广泛的科学计算、工程计算等场景,但可能产生舍入误差。选择使用哪种类型应根据实际业务需求、系统性能要求和数据交换要求综合考虑。

实战应用

P类型和F类型的计算问题

1、F类型能够避免乘除后精度问题,而P类型不行。

DATA: c TYPE c LENGTH 10,
      p TYPE p DECIMALS 3 VALUE '1.234',
      f TYPE f            VALUE '123.4567'.

p = f.
WRITE: / f. "1.2345670000000000E+02
WRITE: / p. "123.457

c = 1 / 3.
c = c * 3.
WRITE: / c. "0.99999999

p = 1 / 3.
p = p * 3.
WRITE: / p. "0.999

f = 1 / 3.
p = f.
WRITE: / p. "0.333

f = f * 3.
p = f.
WRITE: / f. "1.0000000000000000E+00
WRITE: / p. "1.000

结果展示:

2、F类型不能精确计算,P类型可以精确计算。

DATA: f1 TYPE f VALUE '2.0',
      f2 TYPE f VALUE '1.1',
      f3 TYPE f.

f3  =  f1 - f2."不能精确计算
WRITE: / f1  , f2 , f3. "2.0000000000000000E+00 1.1000000000000001E+00 8.9999999999999991E-01

DATA: p1 TYPE p DECIMALS 1 VALUE '2.0',
      p2 TYPE p DECIMALS 1 VALUE '1.1',
      p3 TYPE p DECIMALS 1.

p3  =  p1 - p2."能精确计算
WRITE: / p1  , p2 , p3. "2.0     1.1     0.9

结果展示:

  • 14
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SAP_亮亮

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

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

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

打赏作者

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

抵扣说明:

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

余额充值