“尽量避免使用浮点数”不是普遍规律。事实上浮点数的应用非常广泛,不然 CPU 里做那么多浮点运算单元岂不是成了智障了。关键是你得知道自己用浮点数的时候究竟是在干什么。

浮点数实际上就是以更少的有效数字为代价换取更大的表示范围,而且有效数字的位数与数值大小无关(先不考虑非规范数这种奇葩),因此数值越大,精度越差。与之相对的,定点数的精度固定,有效数字的位数与数值大小相关。

你要是需要让不同数量级的数都有相同的表示精度,那就用定点数;你要是希望不同数量级的数都有相同位数的有效数字,那就用浮点数。

当然实际应用中也有其他情况,比如定点数和浮点数都能满足精度要求,但是浮点数由于有硬件和编程语言支持,写起来比较方便,那就用浮点数。

至于网上见得很多的 0.2 不能用浮点数表示之类的问题,根本原因反而不在浮点数,而在二进制小数。二进制小数不能用有限的数字表示 1/5,就如同十进制小数不能用有限的数字表示 1/3 一样。二进制定点数也有同样的问题,而十进制浮点数就没有这个问题。只不过因为常用的浮点数格式都是二进制,导致大家觉得这是浮点数的锅。

至于用分子和分母的形式表示的有理数,除非你有非常明确的应用场景,或者能够控制分母和分子的大小,否则轻易不要用。不然你会发现一不小心分子和分母就溢出了,然后就要用高精度整数。或者写到一半发现这里要开个平方根或者求个三角函数,然后发现结果根本不是有理数了,进而开始怀疑人生。