Float与Decimal
Float
对于单精度浮点数Float: 当数据范围在±131072(65536×2)以内的时候,float数据精度是正确的,但是超出这个范围的数据就不稳定;
不稳定体现在:例如同样插入一个数值为由131072.32的两条数据,131072.32可能变成了131072.31也可能保持131072.32,这就是浮点数的不精确性造成的。
踩到的坑:
用户积分字段设置为float(11,1),存储的最小值与最大值为0.0(无符号)|-9999999999.9(有符号)与9999999999.9,当数值超过整数位数为8位时,抽奖进行计算扣除100的积分,数据库score=score-100的实际结果只有减去96,而进行1000积分的减法时,数据准确。
Decimal
用于在数据库中存储精确的数值。我们经常将DECIMAL数据类型用于保留准确精确度的列,例如会计系统中的货币数据。
DECIMAL(P,D)表示列可以存储D位小数的P位数。十进制列的实际范围取决于精度和刻度。
与INT数据类型一样,DECIMAL类型也具有UNSIGNED和ZEROFILL属性。 如果使用UNSIGNED属性,则DECIMAL UNSIGNED的列将不接受负值。
如果要遵守公认会计原则(GAAP)规则,则货币栏必须至少包含4位小数,以确保舍入值不超过$0.01。
共性:
输入的小数位数超出范围,将自动进行四舍五入处理后写入;
若数值在其取值范围之外,则直接报Out of range value错误。
注意
很多小数根本无法在二进制计算机中精确表示(比如最简单的 0.1)由于浮点数尾数域的位数是有限的,为此,浮点数的处理办法是持续该过程直到由此得到的尾数足以填满尾数域,之后对多余的位进行舍入。
所以在小数在进行计算的时候在php可以引用bcadd、bcsub、bcmul、bcdiv等精度计算的方法进行计算。