informix
INFORMIX-ESQL/C Programmer's Manual
Working with Numeric Data Types

The Decimal Data Type

ESQL/C supports the SQL DECIMAL and MONEY data types with the decimal data type. The decimal data type is a machine-independent method that represents numbers of up to 32 significant digits, with valid values in the range 10-129 to 10+125.

The DECIMAL data type can take the following two forms:

For a complete description of the DECIMAL data type, see the Informix Guide to SQL: Reference.

The decimal Structure

Use the decimal data type to declare host variables for database values of type DECIMAL. A structure of type decimal represents a value in a decimal host variable, as follows:

The decimal.h header file contains the decimal structure and the typedef dec_t. Include this file in all C source files that use any decimal host variables with the following include directive:

The decimal structure stores the number in pairs of digits. Each pair is a number in the range 00 to 99. (Therefore, you can think of a pair as a base-100 digit.) Figure 5-2 shows the four parts of the decimal structure.

Figure 5-2
Fields in the decimal Structure

Field Description
dec_exp The exponent of the normalized decimal type number. The normalized form of this number has the decimal point at the left of the left-most digit. This exponent represents the number of digit pairs to count from the left to position the decimal point (or as a power of 100 for the number of base-100 numbers).
dec_pos The sign of the decimal type number. The dec_pos field can assume any one of the following three values: 1: when the number is zero or greater
0: when the number is less than zero
-1: when the value is null
dec_ndgts The number of digit pairs (number of base-100 significant digits) in the decimal type number. This value is also the number of entries in the dec_dgts array.
dec_dgts[] A character array that holds the significant digits of the normalized decimal type number, assuming dec_dgts[0] ! = 0. Each byte in the array contains the next significant base-100 digit in the decimal type number, proceeding from dec_dgts[0] to dec_dgts[dec_ndgts].

Figure 5-3 shows some sample decimal values.

Figure 5-3
Sample decimal Values

Value decimal Structure Field Values
dec_exp dec_pos dec_ndgts dec_dgts[]
-12345.6789 3 0 5 dec_dgts[0] = 01
dec_dgts[1] = 23
dec_dgts[2] = 45
dec_dgts[3] = 67
dec_dgts[4] = 89
1234.567 2 1 4 dec_dgts[0] = 12
dec_dgts[1] = 34
dec_dgts[2] = 56
dec_dgts[3] = 70
-123.456 2 0 4 dec_dgts[0] = 01
dec_dgts[1] = 23
dec_dgts[2] = 45
dec_dgts[3] = 60
480 2 1 2 dec_dgts[0] = 04
dec_dgts[1] = 80
.152 0 1 2 dec_dgts[0] = 15
dec_dgts[1] = 20
-6 1 0 1 dec_dgts[0] = 06

You can use the deccvasc demonstration program to experiment with how ESQL/C stores decimal numbers.

The decimal Library Functions

You must perform all operations on decimal type numbers through the following ESQL/C library functions for the decimal data type. Any other operations, modifications, or analyses can produce unpredictable results. For more information on the syntax and behavior of these functions, refer to the referenced pages.

Function Name Description Page Reference
Manipulation Functions
decadd() Adds two decimal numbers B-19
deccmp() Compares two decimal numbers B-21
deccopy() Copies a decimal number B-23
decdiv() Divides two decimal numbers B-34
decmul() Multiplies two decimal numbers B-43
decround() Rounds a decimal number B-45
decsub() Subtracts two decimal numbers B-48
dectrunc() Truncates a decimal number B-60
Type Conversion Functions
deccvasc() Converts a C char type value to a decimal type value B-25
deccvdbl() Converts a C double type value to a decimal type value B-28
deccvint() Converts a C int type value to a decimal type value B-30
deccvlong() Converts a C 4-byte integer type value to a decimal type value B-32
dececvt() Converts a decimal value to an ASCII string B-37
decfcvt() Converts a decimal value to an ASCII string B-37
dectoasc() Converts a decimal type value to an ASCII string B-50
dectodbl() Converts a decimal type value to a C double type value B-53
dectoint() Converts a decimal type value to a C int type value B-55
dectolong() Converts a decimal type value to a C 4-byte integer type value B-58

For information about the function rfmtdec(), which allows you to format a decimal number, see Numeric-Formatting Functions. For additional information on decimal values, see Using Operations That Involve a Decimal Value


INFORMIX-ESQL/C Programmer's Manual, Version 9.21
Copyright © 1999, Informix Software, Inc. All rights reserved