【问题标题】:float precision problem in mysqlmysql中的浮点精度问题
【发布时间】:2012-05-10 21:04:31
【问题描述】:

谁能解释一下 FLOAT 在 mySQL 中的工作原理?我知道 float 是近似的,但真的有这么大的区别吗?而且只有9位,不是溢出问题吧?

mysql> create table t(f FLOAT(15,2), db DOUBLE);
mysql> insert into t(f,db) VALUES (512659663, 512659663);
mysql> select * from t;

+--------------+-----------+
| f            | db        |
+--------------+-----------+
| 512659648.00 | 512659663 |
+--------------+-----------+

(mysql Ver 14.14 Distrib 5.1.44, for Win32 (ia32) on Windows XP)

【问题讨论】:

    标签: mysql types floating-point double


    【解决方案1】:

    FLOAT32-bit 类型,顾名思义,是浮点数。数值越高,绝对精度越低。

    512659648 大到可以引入几十个错误。

    Update:

    IEEE-754(这就是FLOAT)中,数据存储在32位中:1-位符号、8-位二进制指数和23-位有效数。

    指数显示2(在您的情况下为28,或268435456)的最接近的最小幂。

    有效数字是二进制小数。它可以存储从12 的数字,精度高达2^-23。在你的情况下,它是1.11101000111010010000110,或者是十进制的~ 1.9098060

    数字计算为指数和有效数字的乘积。

    鉴于所有这些,该订单的数字的精度为 2 ^ (28 - 23) = 2 ^ 5 = 322^282^29)。

    【讨论】:

    • 是否可以估计近似误差?它取决于数字的大小是线性的还是有其他的?
    • @ts : 32 位 IEEE 754 浮点数可以保持大约 7 位十进制数字的精度; 64 位的可以容纳大约 16 个十进制数字。超过 7 位数的任何内容都会遇到问题。 FLOAT(15,2) 限定词是一厢情愿而不是有效; (15,2) 基本上被忽略了。
    • @Jonathan:,2 部分将被视为较小的值,而15 将被视为较大的值。
    • 这是否意味着您将不允许存储绝对值小于 0.01 且大于 0.00 的值,也不允许存储绝对值 10^13 或更大的值?如果是这样,那么预选赛有一些优势,但期望 32 位浮点数的 15 位精度仍然希望月球。
    • @Jonathan:您可以插入任意小值,但它们将四舍五入到最接近的0.01(然后转换为IEEE)。大于10^14 - 1 的值确实不会成功。 15 数字不是精度数字,而是十进制表示的最精确近似值的数字。
    【解决方案2】:

    实际上,在 MySQL 中,FLOAT 和 DOUBLE 都是近似浮点数。 MySQL uses four bytes for single-precision values and eight bytes for double-precision values.

    所以,两列都是近似值 - 只是您的 FLOAT 列只有 4 个字节来尝试近似您的数字。

    【讨论】:

      【解决方案3】:

      单精度浮点数的尾数长度为 22 位。因此它无法准确存储大于 2^22 的整数,即 4194304。

      【讨论】:

      • IEEE 754 在尾数的开头有一个隐含的 1 位,有效地添加了 1 位。 32 位数字的尾数中有符号位、8 位指数和 23+1 位。请参阅:WikipediaGeneral Decimal Arithmetic
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多