问题描述
在声明浮点变量时,我不明白RPG中存储对象所需的精度??
在我的练习中,我输入了份数,例如值 5
。
总金额为 0.50 欧元,但我有喜欢的消息:
我不明白如何在 double 中正确声明变量 total
。
H
D Numbercopy S 3S 0
D Total S ???
*
/Free
dsply 'Enter your copy number please : ' '' Numbercopy;
If (Numbercopy < 11);
Total = Numbercopy * 0.10;
ElseIf (Numbercopy < 31);
Total = (10 * 0.10) + (Numbercopy - 10) * 0.09;
Else;
Total = (10 * 0.10) + (20 * 0.09) + (Numbercopy - 30) * 0.08;
EndIf;
dsply ('The amount is of ' + %Char(Total) + ' euros');
*inlr = *on;
/End-Free
这是我在 RPGPDM 上找到的。
D Float1 S 8F
https://www.rpgpgm.com/2014/02/defining-variables-in-rpg-all-free.html
解决方法
您已将 Float1 声明为“double”。但问题是浮点数不是固定十进制精度数的好选择。见https://en.wikipedia.org/wiki/Floating-point_arithmetic#Accuracy_problems。
如果您正在处理需要正确精度而不仅仅是一些近似值的数字,您应该使用压缩或分区。
,在练习开始时说不要在 RPG 中使用 FLOAT。它会让你非常不开心。要回答您的问题:dcl-s total float(8);
您有两个浮动问题:
- 您不希望您的客户因为 1990 年的准确性问题而收到错误的发票。
- Decimals 也能够使用硬件支持来更快地进行评估,这并不“重要”但很好。
如果你想显示一个浮动,你可以做类似的事情
dcl-s outputString char(10) inz;
dcl-s total float(8) inz (5);
outputString = %char(%dec(total: 10: 2));
dsply outputString;
一些提示:
- 不要使用 /free 或 /end-free 编译器能够自行确认。
- 不要使用固定格式声明来定义您的字段。它们更难阅读,并且没有实际理由使用它们。