`
luccs624061082
  • 浏览: 84955 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

mysql select float 查询精度问题

阅读更多
这个问题是在开发的时候遇到的,数据库表中由于插入浮点型数据,导致输入相同的数字比如14.9 无法查询结果,当时为了使服务运行,直接在代码中减1。之后,在网上查查后,发现遇到float的精度问题的时候,即使指定为float(d,m)d:表示整数位数,m:表示小数点后面的位数。还是会出现精度丢失问题,主要是四舍五入导致的。
为了解决这个问题,使用decimal数据保存浮点型问题,可以很好的解决精度。
这是网上的例子:
float,double容易产生误差,对精确度要求比较高时,建议使用decimal来存,decimal在mysql内存是以字符串存储的,用于定义货币要求精确度高的数据。在数据迁移中,float(M,D)是非标准定义,最好不要这样使用。M为精度,D为标度。

mysql> create table t1(c1 float(10,2), c3 decimal(10,2));
Query OK, 0 rows affected (0.02 sec)

mysql> insert into t1 values(1234567.23, 1234567.23);
Query OK, 1 row affected (0.01 sec)

mysql> select * from t1;
+------------+------------+
| c1 | c3 |
+------------+------------+
| 1234567.25 | 1234567.23 |
+------------+------------+
1 row in set (0.02 sec)

mysql> insert into t1 values(9876543.21, 9876543.12);
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> select * from t1;
+------------+------------+
| c1 | c3 |
+------------+------------+
| 1234567.25 | 1234567.23 |
| 9876543.00 | 9876543.12 |
+------------+------------+
2 rows in set (0.00 sec)


不定义fload, double的精度和标度时,存储按给出的数值存储,这于OS和当前的硬件有关。

decimal默认为decimal(10,0)

因为误差问题,在程序中,少用浮点数做=比较,可以做range比较。如果数值比较,最好使用decimal类型。

精度中,符号不算在内:

mysql> insert into t1 values(-98765430.21, -98765430.12);
Query OK, 1 row affected (0.01 sec)

mysql> select * from t1;
+--------------+--------------+
| c1 | c3 |
+--------------+--------------+
| 1234567.25 | 1234567.23 |
| 9876543.00 | 9876543.12 |
| -98765432.00 | -98765430.12 |
+--------------+--------------+
3 rows in set (0.00 sec)

float占4个字节,double占8个字节,decimail(M,D)占M+2个字节。

这里补充一点,就是在数据库中一般用的还是int float string 类型,decimal很少用到,而且在插入数据库的时候,不同的浮点数,插入进数据库时也不同,比如14.9插入到数据库是14.90000,而62.1插入数据库是62.098888,最好在SQL语句中把变量由float改为String类型即 %f---》%s,这个问题就解决了。
另外在float型数据出现精度问题,直接减掉0.01就能很好的解决问题,而不需要用decimal数据类型
分享到:
评论

相关推荐

    mysql下float类型使用一些误差详解

    mysql中float数据类型的问题总结 对于单精度浮点数Float: 当数据范围在±131072(65536×2)以内的时候,float数据精度是正确的,但是超出这个范围的数据就不稳定,没有发现有相关的参数设置建议:将float改成...

    mysql中sum float类型使用小数点的方法

    在MySQL数据库中,当对`float`类型的数据执行`SUM`函数时,可能会遇到小数点后数值不精确的问题。这是因为`float`类型是近似数值存储,它并不保证完全精确,尤其在进行数学计算时可能会引入误差。为了解决这个问题,...

    Mysql从入门到精通.pdf

    - 小数型:即浮点数,分为float和double,可以指定精度(m,d),其中m是总长度,d是小数点后的长度。 - 定点:decimal类型,用于精确的小数值,同样可以指定精度。 - 日期时间型:包括year、date、time、...

    MySQL面试题及答案.pdf

    使用 MySQL 查询浏览器支持管理。 6. FLOAT 和 DOUBLE 的区别 FLOAT 和 DOUBLE 都是浮点数类型,但是它们的精度不同。FLOAT 以 8 位精度存储浮点数, chiếm用四个字节。DOUBLE 以 18 位精度存储浮点数,占用八个...

    MySQL面试题(含答案).pdf

    - FLOAT存储8位精度的数据,占用4个字节。 - DOUBLE存储18位精度的数据,占用8个字节。 6. ID自增主键的逻辑: - 删除记录并重启MySQL后,插入新记录的ID将是18,因为自增ID不会回退。 7. CHAR_LENGTH与LENGTH...

    精选常见mysql五十五道面试题目

    6. FLOAT和DOUBLE的区别在于存储精度和字节数,FLOAT有8位精度,4个字节,而DOUBLE有18位精度,8个字节。 7. CHAR_LENGTH返回字符数,考虑字符集;LENGTH返回字节数,不受字符集影响。 8. InnoDB支持的四种事务...

    Mysql数据库设计.pdf

    - **FLOAT**和**DOUBLE**:用于存储浮点数,FLOAT为4字节单精度,DOUBLE为8字节双精度。 - **DECIMAL(M)**:可变精度的浮点数,M表示总位数,包括小数点。 3. **日期与时间类型**: - **DATE**:"YYYY-MM-DD",...

    mysql大全 全面讲解

    5. 查询数据:SELECT语句是数据库操作的核心,它可以按条件、排序、分组等方式查询数据。 6. 更新数据:UPDATE语句用于修改已存在的记录。 7. 删除数据:DELETE FROM语句用于删除表中的记录,DROP TABLE语句用于删除...

    MySQL55题答案.pdf

    6. 浮点数类型的区别:FLOAT类型以8位精度存储,占用4个字节,而DOUBLE类型具有18位精度,占用8个字节。 7. CHAR_LENGTH和LENGTH的区别:CHAR_LENGTH返回字符数,LENGTH返回字节数。对于Latin字符,两者可能相同,...

    mysql详细的基础语法

    数字类型包括INT(整数)、FLOAT(单精度浮点数)、DOUBLE(双精度浮点数,支持ZEROFILL属性)等。 B. 字符串类型包括CHAR(定长字符串)、VARCHAR(变长字符串)、TEXT/BLOB(超过255个字符的长字符串)等。 C. ...

    mysql8中文参考手册-latest200708.zip

    MySQL 8.0提供了多种数据类型,如整数类型(TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT)、浮点和双精度类型(FLOAT、REAL、DOUBLE)、字符串类型(CHAR、VARCHAR、TEXT)、日期和时间类型(DATE、TIME、DATETIME、...

    2024年java面试题-数据库MySQL面试题第一部分

    根据给定文件的信息,我们可以总结出一系列关于MySQL的知识点,特别是针对面试中可能出现的问题及其解答。下面是详细解析: ### 1. ID 自增主键的行为 - **问题**:一张表中有 ID 自增主键,当插入了 17 条记录之后...

    MySQL 入门文档、示例

    - 精确小数类型:`DECIMAL`,避免浮点数的精度问题。 - 日期和时间类型:`DATE`、`TIME`、`DATETIME`、`TIMESTAMP`、`YEAR`。 - 字符串类型:`CHAR`、`VARCHAR`,还有二进制版本`BINARY`和`VARBINARY`。 - 大对象...

    MySQL基础使用笔记

    而连接查询(JOINs)和子查询的组合可以解决非常复杂的数据检索问题。 总的来说,理解并熟练运用这些MySQL基础知识是成为合格数据库管理员或开发者的关键。随着经验的积累,你将能够有效地设计、管理和优化数据库,...

    面试专题-面试人员必看-MySQL专题.pdf

    FLOAT在MySQL中是8位精度,占用四个字节;DOUBLE是18位精度,占用八个字节。 7. 字符串函数的区分: CHAR_LENGTH()函数返回字符数,LENGTH()函数返回字节数。在Latin字符中这两个值相同,但在处理Unicode或其他编码...

    MySQL55道面试题及答案

    FLOAT 和 DOUBLE 是浮点数类型的两种实现,FLOAT 以 8 位精度存储,DOUBLE 以 18 位精度存储。 7. CHAR_LENGTH 和 LENGTH CHAR_LENGTH 是字符数,而 LENGTH 是字节数。Latin 字符的这两个数据是相同的,但是对于 ...

    关于MySql的SQL语言MySQL入门教程.pdf

    2. FLOAT和DOUBLE:FLOAT用于单精度浮点数,DOUBLE用于双精度浮点数,提供更高的精度。 3. NUMERIC(M,D):用于存储固定精度的浮点数,M代表总位数,D代表小数位数。 4. DATE和DATETIME:DATE用于存储日期,DATETIME...

    mysql教程.pdf

    - **查询**: SELECT语句用于检索数据。 - **插入**: INSERT语句用于向表中添加新的数据行。 - **更新**: UPDATE语句用于修改现有数据行。 - **删除**: DELETE语句用于删除数据行。 **1.3.4 总结** - SQL语言是与...

Global site tag (gtag.js) - Google Analytics