MySQL之Float(浮点数)

比较浮点数

  • 浮点数不能用“=/==”来查找
    因为有两个原因
    1.浮点数之间的精度不同 (如单精度双精度)不同精度下相同数据在计算机内部的表示可能不一样。如 7.22用32位二进制是表示不下的。
    所以就不精确了。
    2.即使在精度相同的情况下,比较也可能会出问题。因为在运算过程中会将内存(或高速缓存)中的值加载到CPU浮点寄存器(80 bit扩展精度)中,然后再进入CPU浮点计算单元进行计算,计算结果写回浮点寄存器,然后写回内存(或高速缓存)。从内存到浮点寄存器,浮点数的精度会扩展,从浮点寄存器到内存,浮点数的精度会降低(精度扩展通常没问题,但如果精度降低了,很可能值会发生变化,出现截断),而浮点运算的结果由于下面还要使用所以暂时保存在浮点寄存器中留待下次使用(没有及时写回内存,这是一种优化策略),从而导致数据并不是内存中和内存中的数据比较而是浮点寄存器中的值和内存中的值进行比较,而无论内存中是float类型还是double类型,其精度和浮点寄存器精度都不相同,从而导致比较结果是不相等。
  • 比较浮点数可使用相减小于一个很小的数来判断
    比如,a=12.1 b=12.1 如果 a-b<0.000001 特别小的数常取1.0e-6 或者 1.0e-7。

mysql中的浮点数表示

  • 在navicat中使用lenth和decimals表示浮点数,如lenth为6,decimals为2,即整数部分最多为四位有效数字,小数部分最多两位有效数字。举个例子,1234.22 如果插入1234.222 就会自动变成1234.22 或者报错。
  • 对于单精度浮点数Float: 当数据范围在±131072(65536×2)以内的时候,float数据精度是正确的,但是超出这个范围的数据就不稳定。
    当整数部分大于131072时,小数点后面会发生随机变化
    如存储 555555.96 就会变成555555.94
mysql中如何精确表示数字
  • 使用mysql中的类型decimal Decimal了精确存储数值
  • 将小数部分乘以一个较大的数字变为整数部分,使用varchar类型存储,用的时候再除以那个数字转变成需要的类型。
    如1.12345678 *100000000 =112345678 使用时再除以100000000

你可能感兴趣的:(MySQL)