Manipulating Real Numbers
Double Conversion
Except for special cases, FIX field values are text-based, so the regular presentation of real numbers with a decimal point is used, for example:
... 35=x|268=3|...|270=9462.50|271=5 ...
The interface of the Message class offers a few overloads, allowing users to set/get field values of native language types like int
, long
and double
.
The field value set/get members convert the value of a primitive type into/from its text presentation.
However, for native types like float
and double
, there is no unambiguous transformation available because double
values usually have no finite presentation due to the limitation of the data type.
For example:
const double Price = 100.10;
The variable value will be 100.099999999999998
, not 100.1
, because each double
value is expressed as X * 2 ^ Y
, where X
is mantissa and Y
is 2-basis exponent.
As a result, there could be accuracy issues.
Using Decimal Instead of double
In contrast to the double
type, Decimal presents real numbers using 10
-basis exponent.
In other words, each decimal number is expressed as X * 10 ^ Y
, where X
is mantissa and Y
is an exponent.
Parsing Decimal
from the text presentation is also free of approximation issues in bounds of values, used in FIX messages.