-
浮点型:
类型 字节数 signed范围 unsigned范围 描述 float 4 (-3.4E+38, 3.4E+38) 0 和 (1.1E-38, 3.4E+38) 单精度浮点数 double 8 (-1.7E+308, 1.7E+38) 0 和 (2.2E-308, 1.7E+308) 双精度浮点数 补充:根据 IEEE754 标准:float (32 = 1+ 8 + 23) 能表示的最大指数为
-126~127
,而2^126 / 2^127 ≈ 10^38
,所以最多表示的指数范围是-38~38
;能表示的小数位数是23
位(1.M
),而2^24 ≈ 1.7*10^7
,所以能保证精度的位数为7
位左右create table type_float ( -- 不指定 M,D(有效位数,小数),默认为硬件所支持的最大值 float_1 float, -- 整数 8 位,小数 2 位 float_2 float(10,2) ); -- 最终插入结果为 12345679.00(浮点数的精度问题暴露无遗) insert into type_float(float_2) values (12345678.90); -- 可以插入科学计数法 insert into type_float(float_2) values (10e5); -- 最终插入结果为 100000000.00(浮点数自身导致的精度问题不会报错) insert into type_float(float_2) values (99999999.99); -- 整数越界报错 insert into type_float(float_2) values (123456789.00); -- 四舍五入得到 99999999.99,不报错 insert into type_float(float_2) values (99999999.994); -- 四舍五入得到 100000000.00,报错 insert into type_float(float_2) values (99999999.995);
-
定点数:
类型 字节数 signed范围 unsigned范围 描述 decimal 自动分配
每大概9个数就会分配4个字节与 (M, D) 有关 与 (M, D) 有关 保证数据精确的小数
总长度 M <= 65
小数位数 D <= 30# 定点数与浮点数类似,但不存在精度不足导致存储不准确的问题 create table type_decimal ( -- 不指定,相当于 (10, 0) decimal_1 decimal, -- 整数 8 位,小数 2 位 decimal_2 decimal(10,2) ); -- 插入结果准确,不会存在精度问题 insert into type_decimal(decimal_2) values (12345678.90); -- 四舍五入得到 99999999.99,不报错 insert into type_decimal(decimal_2) values (99999999.994); -- 四舍五入得到 100000000.00,报错 insert into type_decimal(decimal_2) values (99999999.995);
结论:在对存储空间要求不是特别严格的情况下,能用定点数就绝不用浮点数