ABAP的计算精度问题。

2020-09-21 15:27发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)大家好, 我遇到了一个关于...

         点击此处--->   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条回答
悻福寶寶
2020-09-21 16:01

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

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

一周热门 更多>