Administrator
发布于 2025-09-06 / 27 阅读
0
0

MySQL第5课:小数类型详解

学完本节课,你将能清楚地回答:

  • MySQL 中哪些类型可以存储小数?

  • FLOATDOUBLEDECIMAL 有什么区别?

  • 怎样选择合适的小数类型?


一、小数数据类型概览

在 MySQL 中,可以存储小数的常用数据类型有三种:

类型名

精度范围

是否存在误差

典型用途

FLOAT

约7位有效数字

✅ 有可能有微小误差

科学计算、图形、物理仿真等

DOUBLE

约15位有效数字

✅ 有可能有误差,但更精确

高精度浮点计算

DECIMAL(M,D)

精度可自定义

❌ 精确无误差

金融、金额、统计类数据

二、FLOAT 与 DOUBLE:浮点型(近似小数)

定义方式

CREATE TABLE test_float (
    f1 FLOAT,
    f2 DOUBLE
);

示例插入与查询

INSERT INTO test_float VALUES (123.456789, 123.456789123456);
SELECT * FROM test_float;

输出结果(示例)

f1

f2

123.4568

123.456789123456

💡 说明:

  • FLOAT 保留约7位有效数字。

  • DOUBLE 保留约15位有效数字。

  • 这两种类型属于近似存储,计算结果可能略有误差。


三、DECIMAL:精确小数(定点数)

语法和参数

DECIMAL(M, D)
  • M:总位数(精度),范围1-65,默认10

  • D:小数位数(标度),范围0-30,且必须≤M,默认0

定义方式

CREATE TABLE test_decimal (
    price DECIMAL(8,2)   -- 共8位,保留2位小数
);

示例插入与查询

INSERT INTO test_decimal VALUES (12345.67), (999999.99);
SELECT * FROM test_decimal;

输出结果:

price

12345.67

999999.99

💡 说明:

  • (M,D) 中,M 表示总位数(整数+小数),D 表示小数位数。

  • 例:DECIMAL(8,2) → 最大值为 999999.99

  • 超过范围的值会被截断或四舍五入


四、三者的区别总结

特性

FLOAT

DOUBLE

DECIMAL

类型

浮点型(近似)

浮点型(更精确)

定点型(精确)

存储方式

二进制

二进制

字符串形式

精度

约7位

约15位

自定义,完全精确

是否有误差

✅ 有

✅ 有

❌ 无误差

常见用途

图形、温度

科学计算

金额、账目


五、实践建议

场景

建议数据类型

存储金额(如价格、工资)

DECIMAL(10,2)

存储温度、比率等

FLOAT

存储科学测量数据

DOUBLE


练习

练习题 1:商品价格表

题目:创建一个 product_prices 表,包含以下字段:

  • product_id:商品ID,整数,主键

  • product_name:商品名称,字符串

  • cost_price:成本价,FLOAT 类型

  • selling_price:销售价,DOUBLE 类型

  • discount_rate:折扣率,DECIMAL(5,4) 类型

测试数据

product_id

product_name

cost_price

selling_price

discount_rate

1

笔记本电脑

3599.50

5999.99

0.8500

2

无线鼠标

45.75

89.90

0.9500

3

机械键盘

199.80

399.50

0.9000

练习题 2:员工薪资表

题目:创建一个 employee_salaries 表,包含以下字段:

  • emp_id:员工ID,整数,主键

  • emp_name:员工姓名,字符串

  • base_salary:基本工资,DECIMAL(10,2) 类型

  • bonus:奖金,FLOAT 类型

  • tax_rate:税率,DOUBLE 类型

测试数据

emp_id

emp_name

base_salary

bonus

tax_rate

101

张三

8000.00

1200.50

0.15

102

李四

12000.00

2500.75

0.20

103

王五

9500.00

1800.25

0.18

练习题 3:科学实验数据表

题目:创建一个 experiment_data 表,包含以下字段:

  • exp_id:实验ID,整数,主键

  • temperature:温度,FLOAT 类型

  • pressure:压力,DOUBLE 类型

  • ph_value:PH值,DECIMAL(3,2) 类型

  • concentration:浓度,DECIMAL(8,6) 类型

测试数据

exp_id

temperature

pressure

ph_value

concentration

1

25.5

101.325

7.20

0.001250

2

37.0

100.123

6.80

0.000500

3

-10.2

102.456

8.50

0.002000

练习题 4:金融交易表

题目:创建一个 financial_transactions 表,包含以下字段:

  • transaction_id:交易ID,整数,主键

  • amount:交易金额,DECIMAL(15,2) 类型

  • exchange_rate:汇率,DOUBLE 类型

  • fee:手续费,FLOAT 类型

  • interest_rate:利率,DECIMAL(6,4) 类型

测试数据

transaction_id

amount

exchange_rate

fee

interest_rate

1001

150000.00

6.8765

25.50

0.0375

1002

50000.00

7.1234

15.25

0.0250

1003

250000.00

6.9567

45.75

0.0425

练习题 5:测量数据表

题目:创建一个 measurement_data 表,包含以下字段:

  • measure_id:测量ID,整数,主键

  • length:长度,FLOAT 类型

  • width:宽度,DOUBLE 类型

  • height:高度,DECIMAL(8,3) 类型

  • weight:重量,DECIMAL(10,4) 类型

测试数据

measure_id

length

width

height

weight

1

15.5

10.25

5.125

2.3450

2

20.0

15.75

8.500

5.6780

3

12.3

8.90

3.250

1.2345

练习答案

完整的建表 SQL 语句

-- 练习题 1:商品价格表
CREATE TABLE product_prices (
    product_id INT PRIMARY KEY,
    product_name VARCHAR(50),
    cost_price FLOAT,
    selling_price DOUBLE,
    discount_rate DECIMAL(5,4)
);
​
-- 练习题 2:员工薪资表
CREATE TABLE employee_salaries (
    emp_id INT PRIMARY KEY,
    emp_name VARCHAR(20),
    base_salary DECIMAL(10,2),
    bonus FLOAT,
    tax_rate DOUBLE
);
​
-- 练习题 3:科学实验数据表
CREATE TABLE experiment_data (
    exp_id INT PRIMARY KEY,
    temperature FLOAT,
    pressure DOUBLE,
    ph_value DECIMAL(3,2),
    concentration DECIMAL(8,6)
);
​
-- 练习题 4:金融交易表
CREATE TABLE financial_transactions (
    transaction_id INT PRIMARY KEY,
    amount DECIMAL(15,2),
    exchange_rate DOUBLE,
    fee FLOAT,
    interest_rate DECIMAL(6,4)
);
​
-- 练习题 5:测量数据表
CREATE TABLE measurement_data (
    measure_id INT PRIMARY KEY,
    length FLOAT,
    width DOUBLE,
    height DECIMAL(8,3),
    weight DECIMAL(10,4)
);

完整的测试数据插入语句

-- 插入商品价格表数据
INSERT INTO product_prices VALUES
(1, '笔记本电脑', 3599.50, 5999.99, 0.8500),
(2, '无线鼠标', 45.75, 89.90, 0.9500),
(3, '机械键盘', 199.80, 399.50, 0.9000);
​
-- 插入员工薪资表数据
INSERT INTO employee_salaries VALUES
(101, '张三', 8000.00, 1200.50, 0.15),
(102, '李四', 12000.00, 2500.75, 0.20),
(103, '王五', 9500.00, 1800.25, 0.18);
​
-- 插入科学实验数据表数据
INSERT INTO experiment_data VALUES
(1, 25.5, 101.325, 7.20, 0.001250),
(2, 37.0, 100.123, 6.80, 0.000500),
(3, -10.2, 102.456, 8.50, 0.002000);
​
-- 插入金融交易表数据
INSERT INTO financial_transactions VALUES
(1001, 150000.00, 6.8765, 25.50, 0.0375),
(1002, 50000.00, 7.1234, 15.25, 0.0250),
(1003, 250000.00, 6.9567, 45.75, 0.0425);
​
-- 插入测量数据表数据
INSERT INTO measurement_data VALUES
(1, 15.5, 10.25, 5.125, 2.3450),
(2, 20.0, 15.75, 8.500, 5.6780),
(3, 12.3, 8.90, 3.250, 1.2345);


评论