Interbase中的浮点数的处理问题

HappyLifqd 2003-12-17 03:32:34
我现在正在使用Interbase,可是现在我遇到了如何处理Interbase的问题,描述如下:我定义了一个Numeric类型的的字段,但我输入的1.21,它会出现1.21000000212的值,这是怎么回事,请问各位大侠,这种问题该如何解决
...全文
78 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
HappyLifqd 2003-12-19
  • 打赏
  • 举报
回复
谢谢康先生的帮忙,我用的是IBEXPERT,可能是它的问题,它不管你将NUMERIC怎么设置,都不会正确的显示,这可能是它本身的问题吧
剑雷 2003-12-18
  • 打赏
  • 举报
回复
将SQL Dialect设为3
CuteBit 2003-12-18
  • 打赏
  • 举报
回复
hi,HappyLifqd(姜福寿)
我给你详细解释一下.
数字在计算机中表达有两种方式:定点和浮点
定点数是使用 int/int64 来表达一个数字.这样的表达精确,但相对范围小.比如很多数据库中支持的 Currency 类型就是使用定点方式存储的.在 ib/fb 中,没有直接支持这个类型,但它对其实就是 Numeric 类型做了处理.当 Numeric(d,y) d <= 9/12 (具体是 9 还是 12 受数据库 Dialect 影响,因为 Dialect=3 支持 bigint 也就是 int64 类型,所以它的定点数范围要大,达到 12.注意,客户端连接时选择 3 ,数据库也必须是 Dialect = 3 时 Dialect = 3 的新特性才生效.如果,客户端 = 1,数据库是3,在操作有 Numeric(12,X)/bigint/datetime 等类型的数据是被提示:Client SQL dialect 1 does not support reference to bigint/datetime datatype 类似的错误),其实也和 Currency 是一样的.
浮点数是使用 IEEE 定义的表达方式存储数字.它的范围很广.但存在精度问题(要了解为什么,请查阅浮点数存储的原理).数据库中 DOUBLE PRECISION/FLOAT 这样的类型就是浮点存储的.在 ib/fb 中,Numeric(D,X) 当 D 大于一定数字比如 15 ,ib/fb 自动使用浮点存储.


我的数据表定义

FLD1 DOUBLE PRECISION Nullable
FLD NUMERIC(10, 2) Nullable
FLD2 FLOAT Nullable

在 isql 中显示
FLD1 FLD FLD2
======================= ===================== ==============
1.210000000000000 1.21 1.2100000

fld2 显示正确是因为 isql 知道处理了 float 字段.
但在 SQL Explorer<delphi/bcb 中的一个工具>就没有这么走运了.
FLD1 FLD FLD2
======================= ===================== ==============
1.210000000000000 1.21 1.21000003814697
因为 VCL 中的 TField(SQL Explorer 是 delphi/bcb 编写的) 使用 double 来处理 float.

BTW: 要查看数据库的 Dialect 用 gstat -h 的命令;修改 Dialect 用 gfix -sql_dialect 命令.
HappyLifqd 2003-12-18
  • 打赏
  • 举报
回复
康先生,你好,你说的这两个办法我都试过了,还不行,首先,谢谢你的帮忙,其次,我想再请问一下,有没有别的办法,或者如果要比较两上浮点数的大小,应该如何操作,谢谢
HappyLifqd 2003-12-18
  • 打赏
  • 举报
回复
将SQL Dialect设为3,我现在设的就是Dialect 3
CuteBit 2003-12-17
  • 打赏
  • 举报
回复
这是个计算机浮点运算问题,不是 ib 的问题.
Numeric(6,2)这样的定义可能能解决.
如果在 fb1.5 中可以用 Numeric(10,2) 这样更大的表达方法.
如果你存放的数字范围大,可以使用, DOUBLE PRECISION 类型.

2,209

社区成员

发帖
与我相关
我的任务
社区描述
其他数据库开发 其他数据库
社区管理员
  • 其他数据库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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