自然环境中的“分区十进制”旨在与 EBCDIC 字符集兼容。
ASCII 将数字表示为 x'3x' -- x'39' 显示为字符“0”到“9”。
EBCDIC 字符集(起源于Hollerith 穿孔卡片)使用类似但不同的方案,其中 x'F0' 显示为字符“0”,而 x'F9' 显示为字符 '9'。
穿孔卡片的固定长度为 80 个字符,在许多情况下,其中 10 或 12 个字符被记录类型标识符和序列号吃掉(如果您将一堆卡片掉在地板上,这非常重要!)。所以空间非常宝贵。不是在每个数字旁边输入“+”或“-”字符,而是在卡的顶部附近使用“打孔”额外的孔来表示正数或负数,从而节省一个字节。
这些打孔字符在 EBCDIC 中被编码为 x"D0' 到 x'D9" 用于 -0 到 -9 和 x'C0' 到 x'C9' 用于 +0 到 +9,通常在数字的最后一位。
因此,“分区十进制”格式。每个字节的前四位是区域,后四位“数字”到 -42 被编码为 x'F4D2'。这更像是一种约定,因为计算机无法使用这种格式做任何事情。因此,在进行任何计算之前,需要将其编码为“打包”格式。这很简单 'X'F4D2' -> x'042D' 主要是抓取最后一个区域,然后从每个字节中提取“数字”四位,然后可以将其转换为二进制。
在设计 IBM 大型机时,最大的用户群是银行、保险公司和公用事业公司。那里的大部分处理都遵循这种模式。
- 读打孔卡。
- 读磁带记录。
- 将每月付款添加到余额中
- 在磁带上存储新余额
- 打印新余额
大多数计算涉及货币金额,并且大部分结果会立即显示。很明显,如果机器可以直接对压缩十进制值进行算术运算,您就可以避免几个昂贵的“转换为二进制”和“转换为十进制”指令。作为奖励,它可以轻松地将小数点放在正确的位置并执行任何小数四舍五入。因此,大量工作用于实现本机压缩十进制指令(零、加、减、乘、除、移位和舍入等)。
This has been the preferred currency format for IBM mainframes ever since.
For many years developers on other platforms poured scorn on the mainframers for using such an archaic format, and, only recently began to realize how difficult it was to do fixed point decimal arithmetic to the standards accountants and tax collectors expect. Thanks to the efforts of Mike_Cowlishaw and others the rest of the world has caught up with the venerable IBM 360 and Java programmers can now calculate sales tax correctly using the BigDecimal library which is based on a variation on the old packed decimal format.