JB0*_*B06 2 c# cobol decimal rounding
我正在用C#重写一个COBOL程序来计算处理钱.然而,从一些第一次计算中,一些十进制舍入是关闭的(与COBOL程序计算的不匹配).
Decimal.Round(19.87 * 2.57, 2) 在C#中返回51.07(51.0659),
COMPUTE varA = 19.87 * 2.57 在COBOL中返回51.06
在这里,COBOL将数字向下舍入,但在其他情况下,它会在C#向下舍入的情况下向上舍入.我不知所措.
这是我必须做的第一个计算之一,所以一旦数字变大,它们与COBOL输出越来越不同.(我有一份报告,我正在测试数字.)
我已经尝试了Math.Round,以及两个类的Floor和Ceiling来获得我应该看到的输出无济于事.
更新:我发现了我的问题.COBOL程序中的计算中使用的许多字段有9个小数位,但结果存储在2位小数位字段中.我在截断后进行计算,而不是之前然后截断.谢谢大家的帮助!每个答案都有帮助
您显示的COBOL COMPUTE只是向下舍入(也就是截断).中间结果将保留两个小数位,如果您使用计算器,您可能会得到的超额值将消失.
如果您不在新程序中复制该行为,则不会与这些数字匹配.
COBOL程序当然应该是四舍五入的,但是你必须让某人去研究它.
COMPUTE varA ROUNDED = 19.87 * 2.57
Run Code Online (Sandbox Code Playgroud)
会得到51.07,因为中间结果将是三位小数,那么如果第三个小数位是5-9,则第二个小数位将增加1,然后结果将被截断.
请注意,在确定正确的值时,COMPUTE有和没有区别ROUNDED很重要.还要注意有两个以上的COBOL动词,DIVIDE并且MULTIPLY根据有和没有的数据自然会有不同的行为ROUNDED.要知道,ADD和SUBTRACT那里的小数位数不同的号码将参与也...
还要注意,COMPUTE越复杂,编码的可能性越大,而不考虑使用的实际中间值.参见这两个,例如:COBOL COMPUTE计算,AS/400:使用COMPUTE函数,不同的结果与不同的字段定义
还要注意,目前的COBOL标准是1985年的标准,其中包括1989年对内在函数的修正和扩展.新标准并不完整,尽管在一些编译器中实现了新的元素,但实现不同类型的舍入的定义并不多.无论如何没有ROUNDED,你将得到"向下舍入".