小数比较

分数与小数

xiǎo shù bǐ jiào

小数比较是通过从左到右检查各位值,判断两个小数中哪个更大、更小或相等。

Visualization

Definition

要比较小数,先对齐小数点,从左到右逐位比较,从最大的位值到最小的位值;数字第一次出现不同的那一位就告诉你哪个数更大。更精确地说,先比较整数部分,再比较十分位,然后是百分位,依此类推,向右继续,直到找到差异为止(在末尾补零,如$0.6 = 0.600$,可以让位数不同的数字逐位比较)。这等价于通过柯西序列或戴德金分割表示来比较实数:$x < y$当且仅当存在$n$使得$\lfloor 10^n x \rfloor < \lfloor 10^n y \rfloor$,这与有序域的公理是一致的。

Example

比较$0.6$和$0.58$,把它们对齐写成$0.60$对$0.58$:十分位数字是$6$对$5$,所以$0.6 > 0.58$立刻可以确定,尽管$0.58$的位数更多。把$0.305$、$0.35$、$0.3$从小到大排序:改写成$0.300$、$0.350$、$0.305$,比较十分位(都是$3$),再比较百分位,得$0.3 < 0.305 < 0.35$。对于以小数展开形式给出的无理数,比较可能需要任意多的位数:比较$\sqrt{2} = 1.41421\ldots$与$1.4142135\ldots$意味着要展开越来越多的位数,直到终于出现差异为止。

Key Insight

位数更多并不意味着小数更大:$0.9$比$0.89$大,因为$9$个十分之一多于$8$个十分之一,所以要始终从左到右、逐位地比较。补齐足够的末尾零后,小数的比较算法与数字字符串的字典序(词典)排序完全相同,这就是为什么数据库中的字符串排序和数值排序可能不一致,"10"在字典序中排在"9"之前,但数值上并非如此。以无限精度比较小数的这种微妙之处正是实数定义的基础:两个柯西序列表示同一个实数当且仅当它们的差收敛于零,这是对边界情形(如$0.999\ldots = 1.000\ldots$)中"相同小数展开"这一说法的形式化版本。