ABAP的计算精度问题。

2020-09-21 15:27发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

我遇到了一个关于除法和乘法的问题。 请参阅以下Java代码。

p = a = 154.8,b = 37,c = 144。

双重d = b/c;

d = a * d;

" d"的结果是39.775

但是,我已经在ABAP中制作了一个类似的程序,请参见下文。

数据lv_decfloat34_1类型为decfloat34。
数据lv_decfloat34_2类型为decfloat34。
数据lv_decfloat34_3类型为decfloat34。
数据lv_decfloat34_4类型为decfloat34。

lv_decfloat34_1 =
lv_decfloat34_1。 。
lv_decfloat34_3 = 144.

lv_decfloat34_4 = lv_decfloat34_2/lv_decfloat34_3。
lv_decfloat34_4 = lv_decfloat34_1 * lv_decfloat34_4。<9999> 9999 9999

写入:lv_decfloat34_4。

数据lv_f_1类型f。
数据lv_f_2类型f。
数据lv_f_3类型f。
数据lv_f_4类型f。

lv_f_1 = '154.8'。
lv_f_2 = 37.
lv_f_3 = 144.

lv_f_4 = lv_f_2/lv_f_3。
lv_f_4 = lv_f_4 * lv_f_1。

*结果为3,9774999999999999E + 01

写入:lv_f_4。

数据lv_p_1(16)类型p DECIMALS 14.
数据lv_p_2(16)类型p DECIMALS 14.
数据lv_p_3(16)类型p DECIMALS 14. < br>数据lv_p_4(16)类型p DECIMALS 14.

lv_p_1 ='154.8'。
lv_p_2 = 37.
lv_p_3 = 144.

lv_p_4 = lv_p_2/lv_p_3。
lv_p_4 = lv_p_4 * lv_p_1。

*结果为39,77499999999931

写:lv_p_4。

我也用C ++做过类似的实验。 结果与JAVA相同。

由于客户正在使用Excel验证结果,结果为39.775,不等于我们的结果。 因此我们遇到了问题。 有人可以解决这个问题吗?

谢谢

Aicro

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

我遇到了一个关于除法和乘法的问题。 请参阅以下Java代码。

p = a = 154.8,b = 37,c = 144。

双重d = b/c;

d = a * d;

" d"的结果是39.775

但是,我已经在ABAP中制作了一个类似的程序,请参见下文。

数据lv_decfloat34_1类型为decfloat34。
数据lv_decfloat34_2类型为decfloat34。
数据lv_decfloat34_3类型为decfloat34。
数据lv_decfloat34_4类型为decfloat34。

lv_decfloat34_1 =
lv_decfloat34_1。 。
lv_decfloat34_3 = 144.

lv_decfloat34_4 = lv_decfloat34_2/lv_decfloat34_3。
lv_decfloat34_4 = lv_decfloat34_1 * lv_decfloat34_4。<9999> 9999 9999

写入:lv_decfloat34_4。

数据lv_f_1类型f。
数据lv_f_2类型f。
数据lv_f_3类型f。
数据lv_f_4类型f。

lv_f_1 = '154.8'。
lv_f_2 = 37.
lv_f_3 = 144.

lv_f_4 = lv_f_2/lv_f_3。
lv_f_4 = lv_f_4 * lv_f_1。

*结果为3,9774999999999999E + 01

写入:lv_f_4。

数据lv_p_1(16)类型p DECIMALS 14.
数据lv_p_2(16)类型p DECIMALS 14.
数据lv_p_3(16)类型p DECIMALS 14. < br>数据lv_p_4(16)类型p DECIMALS 14.

lv_p_1 ='154.8'。
lv_p_2 = 37.
lv_p_3 = 144.

lv_p_4 = lv_p_2/lv_p_3。
lv_p_4 = lv_p_4 * lv_p_1。

*结果为39,77499999999931

写:lv_p_4。

我也用C ++做过类似的实验。 结果与JAVA相同。

由于客户正在使用Excel验证结果,结果为39.775,不等于我们的结果。 因此我们遇到了问题。 有人可以解决这个问题吗?

谢谢

Aicro

付费偷看设置
发送
5条回答
悻福寶寶
2楼-- · 2020-09-21 16:01

如果您阅读了ABAP文档,您将了解原因(小数点后14位数字,将37/144存储为0.25694444444444的不精确值,它无法存储存在无穷序列号的事实 " 4",因此由于在第15个位置缺少" 4",如果乘以37,您将得到39.77499999999931)。

但是由于我不是C ++/java专家,所以我无法解释这些语言如何获得正确的结果,因为我认为"双重"存储与ABAP类型" F"(二进制)的逻辑相同 8个字节的浮点数,尾数相同,依此类推)。 当然,这里要测试的十进制浮点类型与"双精度"不同。

三十六小时_GS
3楼-- · 2020-09-21 15:56

根据SAP预定义的数据元素,Decfloat16可以有16个小数,而decfloat34可以有34个小数。

您可以使用3个十进制的包装类型P转换为所需的十进制格式。

以下是您可以使用的代码段。

 DATA lv_decfloat34_1 TYPE f。
 数据lv_decfloat34_2类型f。
 数据lv_decfloat34_3类型f。
 数据lv_decfloat34_4类型f。
 数据lv_decfloat34_5 TYPE p十进制数3。


 lv_decfloat34_1 ='154.8'.lv_decfloat34_2 = 37.lv_decfloat34_3 = 144。
 lv_decfloat34_4 = lv_decfloat34_2/lv_decfloat34_3.lv_decfloat34_4 = lv_decfloat34_1 * lv_decfloat34_4。
 lv_decfloat34_5 = lv_decfloat34_4

 写:lv_decfloat34_5。
huskylover
4楼-- · 2020-09-21 16:05

您的计算输出为39+(31/40),因此精确为39.775。

如果一步完成,会发生什么?

 lv_decfloat34_4 = lv_decfloat34_1 * lv_decfloat34_2/lv_decfloat34_3。
Aaron 3364
5楼-- · 2020-09-21 16:02

Hi Himanshu,

感谢您的答复,但我不希望这样转换,因为无法看到我应保留哪个小数,即在这种情况下我有3个小数,但在其他情况下我们需要更多。 JAVA和C ++的作用是如此自然,以至于它直接告诉我"正确"的结果。

所以我想知道,包括功能模块在内的任何方式都可以具有与JAVA和C ++相同的行为。

一周热门 更多>