自然環境での「ZonedDecimal」は、EBCDIC文字セットと互換性があることを意味します。
ASCIIは、数値をx'3x'-x'39'として表し、文字「0」から「9」として表示されます。
EBCDIC文字セット(ホレリスのパンチカードに由来)は、x'F0'が文字"0'として表示され、x'F9'が文字'9'として表示される、類似しているが異なるスキームを使用します。
パンチカードの長さは80文字に固定されており、多くの場合、これらの文字のうち10文字または12文字が、レコードタイプ識別子とシーケンス番号で使い果たされていました(大量のカードを床に落とした場合は非常に重要です)。そのため、スペースは貴重でした。各数字の横に「+」または「-」文字を入力するのではなく、カードのトップビットの近くにある「オーバーパンチ」の余分な穴を使用して正または負の数字を表し、バイトを節約しました。
これらのオーバーパンチされた文字は、通常、数字の最後の桁に、-0から-9の場合はx "D0'からx'D9"、+0から+9の場合はx'C0'からx'C9'としてEBCDICに含まれていました。
したがって、「ZonedDecimal」形式です。各バイトの最初の4ビットはゾーンであり、-42までの「数値」の次の4ビットはx'F4D2'としてエンコードされました。コンピュータはこのフォーマットでは何もできなかったので、これは他の何よりも慣例です。したがって、計算を行う前に、「パック」形式にエンコードする必要がありました。これは非常に簡単です。s'X'F4D2->x'042D'は、ほとんどの場合、最後のゾーンを取得し、各バイトから「数値」4ビットを抽出して、バイナリに変換できる場合です。
IBMメインフレームが設計されたとき、ユーザーの最大のグループは銀行、保険会社、公益事業会社でした。そこでの処理の大部分はこのパターンに従いました。
- パンチカードを読んでください。
- テープレコードを読み取ります。
- バランスをとるために毎月の支払いを追加します
- 新しいバランスをテープに保存する
- ニューバランスを印刷する
ほとんどの計算には通貨額が含まれ、ほとんどの結果はすぐに表示されました。マシンがパックされた10進数値に対して直接算術演算を実行できれば、いくつかの高価な「2進数に変換」および「10進数に変換」命令を回避できることが明らかになりました。ボーナスとして、小数点を正しい位置に配置し、小数点の丸めを簡単に実行できるようになりました。そのため、ネイティブのパック10進数命令(ゼロ、加算、減算、乗算、除算、シフト、丸めなど)の実装に多大な労力が費やされました。
それ以来、これはIBMメインフレームで推奨される通貨形式です。
長年、他のプラットフォームの開発者は、そのような古風な形式を使用するためにメインフレーマーに軽蔑を注ぎ、つい最近、会計士や収税人が期待する固定小数点演算を行うことがいかに難しいかを理解し始めました。Mike_Cowlishawやその他の努力のおかげで、世界中が由緒あるIBM 360に追いつき、Javaプログラマーは古いパック10進数形式のバリエーションに基づくBigDecimalライブラリを使用して消費税を正しく計算できるようになりました。