お金を扱う計算を行う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#が切り捨てる場所で切り上げます。私は途方に暮れています。
これは私がしなければならない最初の計算の1つであるため、数値が大きくなると、COBOL出力とはますます異なります。(数値をテストしているという報告があります。)
両方のクラスのMath.RoundとFloorとCeilingを試して、無駄に見えるはずの出力を取得しました。
更新:私は自分の問題が何であるかを見つけました。COBOLプログラムの計算で使用されるフィールドの多くは、小数点以下9桁でしたが、結果は小数点以下2桁のフィールドに保管されていました。私は、切り捨てる前ではなく、切り捨てた後に計算を行っていました。皆さんの助けに感謝します!すべての答えが役に立ちました!
表示されているCOBOLCOMPUTEは、単純に切り捨てられています(切り捨て)。中間結果は小数点以下2桁で保持され、電卓を使用した場合に予想される超過値は単純に消えます。
新しいプログラムの動作でそれを複製しないと、数値と一致しません。
COBOLプログラムがあることはもちろん可能であるべきで丸めことが、あなたはそれに見て誰かを取得する必要があります。
COMPUTE varA ROUNDED = 19.87 * 2.57
中間結果は小数点以下3桁になるため、51.07になります。その場合、小数点以下第3位が5〜9の場合、小数点以下第2位が1増加し、その場合にのみ結果が切り捨てられます。
正しい値を決定するには、ある場合COMPUTE
とない場合の違いROUNDED
が重要であることに注意してください。さらに2つのCOBOL動詞があることにも注意してください、DIVIDE
そしてMULTIPLY
自然とないデータに応じて、異なる動作を考えています、ROUNDED
。その点に注意してくださいADD
とSUBTRACT
どこ小数点以下の異なる数が関与しているにもだろう...
また、COMPUTEが複雑であるほど、実際に使用されている中間値を考慮せずにコーディングされている可能性が高いことにも注意してください。たとえば、次の2つを参照してください。COBOLCOMPUTE計算、AS / 400:COMPUTE関数の使用、異なるフィールド定義での一貫性のない結果
また、現在のCOBOL標準は1985標準であり、組み込み関数の1989の修正と拡張が行われていることにも注意してください。新しい標準は完全ではなく、その中の新しい要素は一部のコンパイラで実装されていますが、さまざまなタイプの丸めの定義を実装しているものは多くありません。とにかくROUNDEDがないと、「切り捨て」られます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加