4

リモート C++ クライアントが (OCCI ライブラリを使用して) Oracle 関数を呼び出し、データを渡す設定があります。この Oracle 関数は、データをテーブルに挿入します。関数に渡されるデータの 1 つは AMOUNT で、これは浮動小数点数です。

C++ クライアントでは、この AMOUNT 変数は「double」として定義されます。Oracle 関数とテーブルの両方で、この列のデータ型が "NUMBER" として定義されています (精度や位取りは明示的に定義されていません)。

クライアントが送信しているものと、受信してデータベースに保存しているものとの間に多くの不一致が見られます。たとえば、クライアントは値「35.6」を渡していると主張していますが、テーブルに表示されているのは「35.59999847」です。

小数点以下 6 桁までの精度で値を保存することになっています。AMOUNT 列のデータ型定義を NUMBER から NUMBER(38,6) に変更すると、「35.599998」になります。NUMBER(38,5)に変更すると「35.6」になってしまいます。

誰かがここで何が起こっているのかを示唆できますか? 金額または価格の値を浮動小数点数として扱うことはお勧めできず、代わりに整数を使用する必要があることはわかっていますが、この場合、C++ クライアントを制御することはできません。また、この問題は非常に大きなデータ セットで発生しています (50% 以上のデータでこの問題が発生しています)。

また、この問題は浮動小数点数だけに限定されません。大きな整数でも矛盾が見られます (たとえば、1000000000 として渡された値は 1000000004 として格納されます)。

4

1 に答える 1