[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 最近更新 | 编码查看转换 | 代码下载 | 常见问题及讨论 | 《深入解析ASP核心技术》 | 王小鸭自动发工资条VBA版
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

[PRO*C] 困惑DOUBLE 的精度

上一篇:关于使用PRO*C编程的一些简单说明和例子
下一篇:Pro * C 的使用

添加日期:2005-5-25 10:51:50 快速返回   返回列表 阅读4207次
用Oracle 8i

数据GLOBAL_INF 的定义是NUMBER

SQL/PLUS 察看数据

SQL> SELECT GLOBAL_INF FROM TBL_SY_GLOBAL_INF WHERE RTRIM(GLOBAL_INF_LABEL)
= 'SP150_JOSU';

GLOBAL_INF
----------
1.4735E+11

SQL> column GLOBAL_INF format 99999999999999999.999999999
SQL> /

GLOBAL_INF
----------------------------
147346063085.951400000

SQL>


PRO*C 中DOUBLE 定义的变量得到的结果却是

147346063085.950989

小数点以后有误差这是为什么呢?

================================================
数据库定义 NUMBER(22) 和 NUMBER (18,4) 会不会引起这样的差别?
=================================================
原因是C 的Double放不下这个数字'147346063085.951400000 
long double 可以解决吗?
=================================================
终于找到办法解决了以上的问题
因为HOST变量不支持LONG DOUBLE,
所以不可以直接得到超过DOUBLE的数据库变量.
我的解决办法是用TO_CHAR函数转换NUMBER到文字列,
把得到的文字列分成整数部分和小数部分,
用C的strtod分别转换成两个double后,
和付给LONG DOUBLE.
========================================================

站长补记:
比如数据库定义为Number(18,5),应该整数部分最多13位(超过报错),小数最多5位(超过自动截取)。
但在Object browser里输入时,(后面数字是OB的显示值)
1234567890.12345没问题,
12345678901.12345就会变成12345678901.1234,最后的5没了。
123456789012.12345就会变成123456789012.123,最后的45没了。
1234567890123.12345就会变成1234567890123.12,最后的345没了。
12345678901234.12345就会变成12345678901234.1,最后的2345没了。
...
注意后面几个数字,别用Object browser输入,跟本输入不了,会被OB截断的,要用SQL语句更新。而且别用OB直接查看,要用select To_char(字段)来查看。

而且在pro*c程序里用double来接收数据库这个字段的时候,
1234567890.12345及前面位数小于10个的都没有问题,double型接收很正确。
12345678901.12345以上,数字开始不精确,比如123456789012.04会变成123456789012.0399。

解决方法就是上面说的了,sql语句里直接TO_CHAR().
 

评论 COMMENTS
没有评论 No Comments.

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved