用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().
|