问题来源
最近在项目中用到了许多浮点数,精度要求较高,小数点后有4位甚至8位的,思考了一下,类似需求在工程计算、数值计算、股票金融、数字货币等场景都会出现。
计算机提供了float/double两种浮点类型的数据来进行科学计算,但计算机中的浮点数据表示是有误差的,它们并不能准确的表示十进制的小数,在进行高精度计算时会产生误差,再经过复杂的传播,误差就变得很不可控了。
为了保证结果的准确性,必须使用高精度计算。高精度计算的基本原理是模拟人工计算过程,保留计算过程中的所有数位,从而达到结果的精确性。各类语言及数据库都提供了对基本浮点类型的支持,扩展库都会提供相应的高精度数据的支持,在MYSQL中,decimal就是高精度浮点数据类型。后文主要介绍decimal的使用和实现原理。
MYSQL中浮点数据介绍
float/double
MYSQL当中的float/double和我们常见的编程语言当中的float/double是一样的,分别表示32位单精度和64位双精度浮点数,在存储上分别需要4字节和8字节。从浮点的特性考虑,float和double都只能近似表示,无法精确。如下图所示,a列为float(10, 4),b列为double,参考第2行,同一个数131072.32保存在a和b的结果是不同的。在超出了浮点数的表示精度后,会有一定的截断,从而引起计算结果的误差。