1

我有一个带有 NUMBER 类型列的 Oracle 表,其中包含一系列浮点数。使用 Pro*C 将其读入 C 变量的正确方法是什么?我尝试了以下方法:

EXEC SQL BEGIN DECLARE SECTION;
static  float   o_start_x;
EXEC SQL END DECLARE SECTION;

EXEC SQL SELECT start_x
FROM  my_table
INTO  :o_start_x;

更常见的是,这不是很好,但是一些浮点数,特别是那些真正接近 0(例如 1.4E-43)的浮点数会导致以下错误:

ORA-01426: numeric overflow;

是否有一种正确/安全的方式来读取这样的值,或者有一种方法可以让 oracle 足够安全地转换类型,从而导致精度损失?

4

1 回答 1

2

float 允许有限的精度 - double 通常有更多,15 位数字。

一个警告:例如,浮点数在处理金钱时会出现问题。示例:.10不能在数据的 IEEE-754 浮点内部表示中精确表示。一个常见的解决方法是让 oracle 使用 BCD 算法,这可以避免浮点问题,然后将最终结果读入双精度数。

FLT_DIG
This is the number of decimal digits of precision for the float data type. Technically, if p and b are the precision and base (respectively) for the representation, then the decimal precision q is the maximum number of decimal digits such that any floating point number with q base 10 digits can be rounded to a floating point number with p base b digits and back again, without change to the q decimal digits.

FLT_DIG 通常是最小精度的六位数,DBL_DIG:15。

只要你避免在 C 代码中做大量的数学计算和比较,除非你知道如何处理我提到的问题和其他问题,否则很容易得到最终的结果。

EXEC SQL BEGIN DECLARE SECTION;
static  double   o_start_x;
EXEC SQL END DECLARE SECTION;

EXEC SQL SELECT start_x
FROM  my_table
INTO  :o_start_x;

如果这个数字很大,您可能必须使用字符串。NUMBER 的限制是 32 位精度,这超出了常见 C 数据类型的精度限制。Pro*C 不支持 bignum 数据类型,AFAIK。

于 2013-10-14T12:23:44.603 回答