是与否
简短的回答是,您的提案的变体一直用于处理完全精确的十进制字符串。它不是任何流行计算机的本机格式,因此它是在软件中处理的,但考虑到如今的 CPU 速度,这几乎无关紧要。关键是将分数存储为以 10 为底的十进制字符串。
现在,您的提议似乎建议在第 32 位和第 33 位之间使用二进制小数点的定点数。这也已经完成,但它并没有解决十进制字符串分数不可表示的问题。
您会看到,问题在于十进制字符串分数是x / (2 n * 5 m )形式的有理数,并且大多数此类值无法以仅表示x / 2 n的二进制分数表示。
因此,例如,在.01和.99之间,只有.25、.50和.75具有精确的二进制表示。IEEE 浮点和您的定点提案都是如此。
现在,如果不是二进制固定点,而是简单地将数字按 10 的幂进行缩放,那么所有数字都将是精确的。因此,如果您的比例为 10 6,则 $123.45 将存储为 123450000。
也就是说,你有两个选择。因为所有整数都具有二进制或十进制的精确表示,所以您可以不存储分数,并按照上述说明简单地缩放,或者您可以存储分数,但在内部使用十进制数字进行。比如说,为每个数字分配 4 位。这种格式称为 BCD。
所有这些技术已被无数次实施,因此您不必自己动手。例如,看看 Ruby 中的 BigDecimal。
如果我们要重做文明,选择一个是 2 的幂的数基可能会很方便。所有这些问题都直接源于我们编写小数值 IRL 的方式。我们使用十进制字符串,这几乎不可能精确地表示为二进制分数。