Float和Decimal的区别

haojialin1981 2010-06-21 08:18:22

我想存入 0.2541 4587.241 这样的浮点数,我字段选哪个类型的比较好啊?

1,Float 2,Decimal


以前一直用float,是不是不好呀? 他精确度不高?


如果我存 10.236525,他这个不精确,是到库里变成10.2365 还是?我不知道,这个不精确指的是什么呀?

是存入所有的数都不精确,无论位数?还是位数多了不精确呀?




Decimal我看也就38位,如果多了,不也不精确了吗?他精确指的是???
...全文
1470 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
claro 2010-06-21
  • 打赏
  • 举报
回复
帮顶

回复的内容极短!
feilniu 2010-06-21
  • 打赏
  • 举报
回复
float可以表示的范围大,但不精确,且运算性能较低,适合需要大范围数值的科学运算;

decimal可以表示的范围比float小,但精确,适合金融、财务等一般对范围要求较小但对精确性要求高的数据。
haojialin1981 2010-06-21
  • 打赏
  • 举报
回复
我存12.35 ,在float的精确范围内,他能准备存储吗?我是问这个,他能变成12.3499999,或者12.35000001吗?他是怎么变成这个的呀?就是说在float的范围内,他能准备存储不?还是超过他范围了,他不准确呀?
claro 2010-06-21
  • 打赏
  • 举报
回复
建议F1,多看联机丛书。

不完全统计,类ERP系统中,int使用最多,float次之,decimal最少;
类似K3财务系统中,int使用最多,decimal次之,float最少。

--当然以上数据仅供参考,不表示任何个人观点。
SQL77 2010-06-21
  • 打赏
  • 举报
回复
FLOAT 是近似类型,DECIMAL是精确
obuntu 2010-06-21
  • 打赏
  • 举报
回复
float

用于表示浮点数值数据的大致数值数据类型。浮点数据为近似值;因此,并非数据类型范围内的所有值都能精确地表示。

所以一般是建议使用decimal,除非你允许不精确的事情发生。


htl258_Tony 2010-06-21
  • 打赏
  • 举报
回复
decimal 数据类型最多可以存储 38 个数字,所有这些数字均可位于小数点后面。decimal 数据类型存储精确的数字表示形式,存储值没有近似值。

定义 decimal 列、变量和参数的两种属性为:

p
指定精度或对象能够支持的数字个数。

s
指定可以放在小数点右边的小数位数或数字个数。
p 和 s 必须遵守规则:0 <= s <= p <= 38。

numeric 和 decimal 数据类型的默认最大精度为 38。在 Transact-SQL 中,numeric 的功能等同于 decimal 数据类型。

当数据值必须严格按指定存储时,可以使用 decimal 数据类型来存储带小数的数字。

有关数学运算如何影响结果的精度和小数位数的详细信息,请参阅精度、小数位数和长度 (Transact-SQL)。

注意:
decimal 和 numeric 数据类型能够以可变长度格式存储,这可能会显著减少存储空间。有关 vardecimal 存储格式的信息,请参阅将 Decimal 数据存储为可变长度类型。



使用 float 和 real 数据
float 和 real 数据类型被称为近似数据类型。float 和 real 的使用遵循有关近似数值数据类型的 IEEE 754 规范。

近似数值数据类型并不存储为许多数字指定的精确值,它们只储存这些值的最近似值。在很多应用程序中,指定值与存储的近似值之间的微小差异并不明显。但有时这些差异也较明显。由于 float 和 real 数据类型的这种近似特性,因此当要求使用精确数值时,比如在财务应用程序、需要舍入的操作或等值核对中,请勿使用这些数据类型。而应使用 integer、decimal、money 或 smallmoney 数据类型。

在 WHERE 子句搜索条件(特别是 = 和 <> 运算符)中,应避免使用 float 列或 real 列。float 列和 real 列最好只限于 > 比较或 < 比较。

IEEE 754 规范提供四种舍入模式:舍入到最近、向上舍入、向下舍入以及舍入到零。Microsoft SQL Server 2005 使用向上舍入。所有的数值都必须精确到确定的精度,但会产生微小的浮点值差异。因为浮点数字的二进制表示法可以采用很多合法舍入规则中的任意一条,因此我们不可能可靠地量化浮点值。

float 和 real (Transact-SQL)

用于表示浮点数值数据的大致数值数据类型。浮点数据为近似值;因此,并非数据类型范围内的所有值都能精确地表示。

注意:
real 的 SQL-92 同义词为 float(24)。



数据类型 范围 存储
float
-1.79E + 308 至 -2.23E - 308、0 以及 2.23E - 308 至 1.79E + 308
取决于 n 的值

real
-3.40E + 38 至 -1.18E - 38、0 以及 1.18E - 38 至 3.40E + 38
4 字节


Transact-SQL 语法约定

语法
float [ ( n ) ]
其中 n 为用于存储 float 数值尾数的位数,以科学记数法表示,因此可以确定精度和存储大小。如果指定了 n,则它必须是介于 1 和 53 之间的某个值。n 的默认值为 53。

n value 精度 存储大小
1-24
7 位数
4 字节

25-53
15 位数
8 字节


注意:
SQL Server 2005 将 n 视为下列两个可能值之一。如果 1<=n<=24,则将 n 视为 24。如果 25<=n<=53,则将 n 视为 53。



SQL Server float[(n)] 数据类型从 1 到 53 之间的所有 n 值均符合 SQL-92 标准。double precision 的同义词为 float(53)。

decimal 和 numeric (Transact-SQL)

带固定精度和小数位数的数值数据类型。

decimal[ (p[ , s] )] 和 numeric[ (p[ , s] )]

固定精度和小数位数。使用最大精度时,有效值从 - 10^38 +1 到 10^38 - 1。decimal 的 SQL-92 同义词为 dec 和 dec(p, s)。numeric 在功能上等价于 decimal。

p(精度)

最多可以存储的十进制数字的总位数,包括小数点左边和右边的位数。该精度必须是从 1 到最大精度 38 之间的值。默认精度为 18。

s(小数位数)

小数点右边可以存储的十进制数字的最大位数。小数位数必须是从 0 到 p 之间的值。仅在指定精度后才可以指定小数位数。默认的小数位数为 0;因此,0 <= s <= p。最大存储大小基于精度而变化。

精度 存储字节数
1 - 9
5

10-19
9

20-28
13

29-38
17

--更多参考联机帮助
Mr_Nice 2010-06-21
  • 打赏
  • 举报
回复
具体还看你要处理什么样的数据。各有用处。

永生天地 2010-06-21
  • 打赏
  • 举报
回复
由于float存储关系,会舍掉小数尾数

decimal能保证精度
claro 2010-06-21
  • 打赏
  • 举报
回复
看需求,个人建议Decimal。
题外话

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧