【问题标题】:MySQL float type range and precision confusionMySQL浮点类型范围和精度混淆
【发布时间】:2023-04-01 20:08:01
【问题描述】:

我正在学习 MySQL,但对 float 的范围和精度有疑问。

来自mannual

对于 FLOAT,SQL 标准允许在括号中的关键字 FLOAT 后面以位为单位指定精度(但不是指数范围)的可选规范。 MySQL 也支持这个可选的精度规范,但精度值仅用于确定存储大小。从 0 到 23 的精度会产生一个 4 字节的单精度 FLOAT 列。从 24 到 53 的精度会产生一个 8 字节的双精度 DOUBLE 列。

我使用这个命令创建了一个表

create table test (f_a float(23));

我有 4 个困惑:

  1. 手册中but not the range of the exponent是什么意思?
  2. 我可以毫无问题地执行insert into test values (1e38);。即使我输入 38 数字它仍然有效。但是39 数字或1e39 会失败。那么这个38是什么意思呢?
  3. 如何检查f_a 的类型转换?当我执行 desc test; 时,f_a 的类型仍然是 float,即使我在该列中插入了 38 数字。
  4. 那么,rangeprecision到底有什么区别呢?

【问题讨论】:

  • 下面的答案很好,但还有一个很好的建议是不要使用这些数据类型,除非你有特定的、知情的理由这样做——这些类型存储 近似值,并且偏爱范围而不是精度。使用DECIMAL 通常是您想要的。浮点数和双精度数必然是不精确的。如果您在计算金钱,DECIMAL 数据类型是唯一可接受的类型。
  • @Michael-sqlbot 好点!许多 tks Mr. Bot:D

标签: mysql floating-point


【解决方案1】:

IEEE 浮点表示不是 MySQL 独有的。它遵循到处使用的相同标准。

1) 忽略长度说明符,这只是噪音。在 MySQL 中,正好有 两种 浮点数据类型:单精度(32 位)和双精度(64 位)。

那个可选的长度说明符只是提供了另一种指定DOUBLE的方式。

 alter table t add foo FLOAT(4), add bar FLOAT(40) ;

等价于

 alter table t add foo FLOAT  , add bar DOUBLE ; 

2) 1e38 中的 38 是 10 的指数幂,相当于

1.0 x 10^38

在不深入所有细节的情况下,浮点数本质上表示为

   sign * mantissa  * (radix ^ exponent)

例如,在base10中,我们可以这样表示值123.45

    +1  * 0.12345   * ( 10 ^ 3 )

或者,我们可以使用 base2,并表示一个值(介于 0 和 1 之间)乘以 2 的某个幂。

3) 1e39 (1.0*10^39) 大于可以用 IEEE 单精度 FLOAT 表示的值的范围。 ("最大可表示的 IEEE 754 浮点值是 2 * 2^−23 * 2^27,大约是 3.402x10^38。

双精度浮点支持更大范围的值,最高可达 10^308。

4) 范围是最小值到最大值。对于 DOUBLE,范围是从 -1 * 10^30810^308

precision 基本上是可以表示的digits 的数量。对于单精度 FLOAT,我们得到大约 7 个十进制数字的精度。对于 DOUBLE,我们的精度大约是 15 位小数的两倍。

--

IEEE 浮点并不是 MySQL 独有的。几乎所有现代处理器都包含浮点运算单元,它们对浮点数进行运算。

参考资料:

https://en.wikipedia.org/wiki/Single-precision_floating-point_format

https://en.wikipedia.org/wiki/Double-precision_floating-point_format

【讨论】:

  • 感谢您的努力!
猜你喜欢
  • 2012-03-14
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
相关资源
最近更新 更多