Telegram Channel
https://github.com/shopspring/decimal?tab=readme-ov-file#faq

搜索 decimal 的库时看到这段 README 很有意思,介绍了为什么在金融应用中不能用有理数(Rational)来替代 decimal。

都知道浮点数只能表示近似值,一般不用于金融领域。而 Golang 中没有内建的 decimal 类型,有些人就提议说可以使用有理数 big.Rat 来代替。但是此文中举了一个通俗易懂的例子来反对这一观点,假设有三个等于 1/3 的有理数 a、b、c,使用 .FloatString(3) 将其转化为 float64 后的值为 0.333,可以看到它们相加后的总额中的 0.001 就消失了。

说到底就是有理数本身虽然没有精度损失,但是将其转换为 float 时会导致精度损失,毕竟你不可能直接给用户显示一个有理数。所以在金融应用中,最好不要使用有理数,而是直接使用整数。而 decimal 存储的实际上就是整数和小数点位置的偏移量。
 
 
Telegram Channel