Re: Pro*C: Loss of Decimal Places INSERTing From "double" Host Var into NUMBER(16,6) Column

From: Fleetie <fleetie_at_nospam.com>
Date: Thu, 22 May 2008 08:51:50 +0100
Message-ID: <g138mn$jjk$1@aioe.org>


"fitzjarrell_at_cox.net" <oratune_at_msn.com> wrote:

>Not without seeing the source code. You do realise that there is the
>BINARY_DOUBLE datatype available?

Sure, but I'm constrained to using the columns already in place, which are NUMBER(16,6). I myself think that the database is in some aspects not well-designed for its intended use. Nevertheless, the fact remains that (AFAICS) a (16,6) column ought to be able to store numbers like 1234567890.123456 without loss of precision.

Admittedly, that is 16 decimal digits, and IIRC, 16 digits is on the limit of what a C double type can represent, but that's not the problem here. We're not seeing loss of precision in the C domain; it's being lost somewhere between C/Pro*C and the database.

Here's the source code from my test program; there's not much to see!

    EXEC SQL BEGIN DECLARE SECTION;
    double TVTime=0.0;
    char TVSTime[20+1]="";
    EXEC SQL END DECLARE SECTION;     [ . . . init stuff, connect to database, etc. . . . ]

    EXEC SQL DELETE FROM TESTPRECISION;     EXEC SQL INSERT INTO TESTPRECISION (KEY,VALUE)

        VALUES
        (
        1,
        1234567890.123456 /* This works without truncating the data */
        );

    TVTime=(double)1234567890.123456;
    EXEC SQL INSERT INTO TESTPRECISION (KEY,VALUE)

        VALUES
        (
        2,
        :TVTime /* This gets truncated to 5 DP; appears as 1234567890.123460 
*/
        );

    sprintf(TVSTime,"%.6f",TVTime);
    EXEC SQL INSERT INTO TESTPRECISION (KEY,VALUE)

        VALUES
        (
        3,
        :TVSTime /* Inserting the value as a string works fine */
        );


Thanks again,

Martin Received on Thu May 22 2008 - 02:51:50 CDT

Original text of this message