点击此处---> 群内免费提供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> 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
请阅读有关计算类型的SAP文档。 和转换规则。
请阅读有关 ROUND < /a>。
如果您阅读了ABAP文档,您将了解原因(小数点后14位数字,将37/144存储为0.25694444444444的不精确值,它无法存储存在无穷序列号的事实 " 4",因此由于在第15个位置缺少" 4",如果乘以37,您将得到39.77499999999931)。
但是由于我不是C ++/java专家,所以我无法解释这些语言如何获得正确的结果,因为我认为"双重"存储与ABAP类型" F"(二进制)的逻辑相同 8个字节的浮点数,尾数相同,依此类推)。 当然,这里要测试的十进制浮点类型与"双精度"不同。
根据SAP预定义的数据元素,Decfloat16可以有16个小数,而decfloat34可以有34个小数。
您可以使用3个十进制的包装类型P转换为所需的十进制格式。
以下是您可以使用的代码段。
您的计算输出为39+(31/40),因此精确为39.775。
如果一步完成,会发生什么?
Hi Himanshu,
感谢您的答复,但我不希望这样转换,因为无法看到我应保留哪个小数,即在这种情况下我有3个小数,但在其他情况下我们需要更多。 JAVA和C ++的作用是如此自然,以至于它直接告诉我"正确"的结果。
所以我想知道,包括功能模块在内的任何方式都可以具有与JAVA和C ++相同的行为。
一周热门 更多>