Ok, das ist auch eine Erklärung.
Beim CLI werden meistens alle Daten in Char, also aufbereitet übergeben. Beim ODBC im korrekten Feldtyp (den Zoned-Fehler hatte ich ca. bei V4R2).

Wenn nun die Dezimal-Betrachtung (meist NLS-Einstellung) nicht korrespondiert kann es genau zu diesem Ergebnis kommen.
CLI bekommt die SQL-Daten bereits von der AS/400 als Zeichen. Abhängig von der Dezimal-Einstellung als Punkt oder Komma.

Nun kommt es auf die Konvertierung im Programm an.
Hierzu gibt es verschiedene Methoden, Beispiel im VisualBasic, analog gilt das auch für C++ o.ä.:

mynum = val(SQLField)
mynum = cdbl(SQLField)

Die Funktion "val()" ist grundsätzlich amerikanisch und ignoriert ein Komma als Tausender-Trennung, ähnlich der C-Funktion atof().
Die Funktion "cdbl()" berücksichtigt das aktuelle Windows-Schema für die Betrachtung des Dezimalpunktes bzw. Kommas. In C++ geht es nur über die MFC-Klasse CVariant bzw ATL-Klasse CComVariant oder die direkten Windows-Variant-Funktionen, die eine Konvertierung von z.B. BSTR in Double durchführen.