这个算不算SQL的一个BUG?

txlicenhe 2003-12-01 07:02:36
SQL2000:

declare @a float,@b float,@c float
select @a = 1234.2,@b = 12345.2,@c = 12345678.2
select @a,@b,@c

1234.2 12345.200000000001 12345678.199999999

(所影响的行数为 1 行)



...全文
28 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
txlicenhe 2003-12-04
  • 打赏
  • 举报
回复
当然是看过帮助的,只是当时不明白为什么"已经赋了值还要取近似值"
多亏蒋老师指点。
pengdali 2003-12-04
  • 打赏
  • 举报
回复
哦,呵呵。看到了对话记录。
pengdali 2003-12-04
  • 打赏
  • 举报
回复
这怎么是bug?

F1呀
pengdali 2003-12-04
  • 打赏
  • 举报
回复
float 和 real
用于表示浮点数字数据的近似数字数据类型。浮点数据为近似值;并非数据类型范围内的所有数据都能精确地表示。
txlicenhe 2003-12-04
  • 打赏
  • 举报
回复
j9988 说:
我认为正常,因为浮点数本身就是一个不精确数。
j9988 说:
不是BUG
马可 说:

j9988 说:
是浮点数本身的机理。
j9988 说:
我找找资料,好象有这方面的说法。
马可 说:
float 和 real
用于表示浮点数字数据的近似数字数据类型。浮点数据为近似值;并非数据类型范围内的所有数据都能精确地表示。

马可 说:
联机帮助
j9988 说:
近似值!对,只是个近似值,不可能绝对准确。
马可 说:
已经赋了值还要取近似值,是比较奇怪
j9988 说:
这要从它的存储机制来理解,好象C上有介绍。反正MS的东东大都跟C写的DLL有关。
马可 说:
还大有来头啊
j9988 说:
并非是要取近似值。而是存进地址后,再取出来就不那么准确了。
j9988 说:
变形了。
马可 说:
有点懂了,谢谢
j9988 说:
我的C书上是这样写的:
j9988 说:
浮点寄存器通常不能精确地存贮浮点数,从而产生误差,在运算和比较中要特别注意。
j9988 说:
跟CPU都有关:浮点寄存器
j9988 说:
“不能精确地存贮”所以一存,一取之间,就出错了。
xiaoliaoyun 2003-12-01
  • 打赏
  • 举报
回复
我也遇到过这个问题,float是近似数值型,它所存储的数据和实际数据之间可能存在细小的差别。所以要求很高的精度的话,我一般用decimal。
不知道float保存的时候是怎么保存的....
zjcxc 元老 2003-12-01
  • 打赏
  • 举报
回复
lvltt 2003-12-01
  • 打赏
  • 举报
回复
txlicenhe 2003-12-01
  • 打赏
  • 举报
回复
/*更怪的*/
declare @a float,@b float,@c float
select @a = 12345.2,@b = 123456.2,@c = 12345678.2
select @a,@b,@c
/*
12345.200000000001 123456.2 (这个怎么又对呢?) 12345678.199999999

(所影响的行数为 1 行)
*/
smallroad 2003-12-01
  • 打赏
  • 举报
回复
关注

34,590

社区成员

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

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