decimal(numeric)、money、float(real) 都是MSSQL中的浮点类型的数据类型。
按存储的范围进行排序
float(real)
decimal(numeric)
money
在金额的存储上可以优先money,如果金额过大采用decimal(numeric),极端的情况(数据超大)使用float(real)
money与float不会自动默认小数点位数,会自动插入的浮点值默认
例如:
CREATE TABLE #A
(
PRICE float
)
drop table #A
INSERT INTO #A
SELECT 100.1245678
UNION ALL
SELECT 101.123
UNION ALL
SELECT 102.12
UNION ALL
SELECT 103.1
UNION ALL
SELECT 103
SELECT * FROM #A
decimal(numeric)类型精度高,可以指定具体的小数点位数,自定义
CREATE TABLE #A
(
PRICE decimal(10,2)
)
drop table #A
INSERT INTO #A
SELECT 100.1245678
UNION ALL
SELECT 101.123
UNION ALL
SELECT 102.12
UNION ALL
SELECT 103.1
UNION ALL
SELECT 103
SELECT * FROM #A
float精度失真实例:
create table q(
money float(15,3)
);
然后插入这个数据:
insert into q values(1234567.234);
再select一下读出来后发现,它显示的是:
1234567.250
然后插入这个数据:
insert into q values(12345672.34);
再select一下读出来后发现,它显示的是:
12345672.000
也就是说,有10数位与以上的话就会出现不准确的情况。
如上可得出结论,数值存储范围越小的精度越高,存储数值范围越大,精度就越不准确,如果存储正常金额的情况下,使用money,好处在于可以存储不指定的小数点位数的数值,比较真实。如果对于既要求精度,又固定小数点位数的数值存储,采用decimal(numeric),优点在于可以自定义小数点位数,精度高。如特殊情况,如数值范围巨大只能用float(real)类型了,此类型一般不提倡使用。