私が思いつく唯一の説明は、データベースとデータベースが表示されている場所との間のパスのどこかで、浮動小数点値に変換されているということです。私は自分の Oracle 開発ツールに PL/SQL Developer を使用しており、非常に信頼できると考えています。以下を実行したときの驚きを想像してみてください。
create TABLE rpj_test (val number(22, 8));
INSERT INTO rpj_test(val) VALUES (6442450941.026600);
SELECT * FROM rpj_test;
あなたが報告した正確な結果を得ました (6442450941.02659968)。なんと!?!?
しかし、その後、重要な質問を自問しました。これをテストして、正しいデータが実際にデータベースにあることを確認するにはどうすればよいでしょうか? そこで、次のクエリを実行しました。
SELECT val * 10000 FROM rpj_test;
私が期待した答えを得ました(64424509410266)。
したがって、データベース内のデータは正しいようです。そこに驚きはありません - 私は、オラクルの NUMBER 型が製品の最も優れた無視された機能の 1 つであると考えています。 )。私の目には、これは浮動小数点の変換エラーのように見えます。どうすればよいでしょうか? そこで、PL/SQL Developer の [Preferences] 構成ダイアログを調べてみると、[SQL Window] タブに "Number fields to_char" というタイトルの小さな設定がありましたが、チェックされていませんでした。これを確認し、最初の SELECT クエリを再実行したところ、見よ、データが期待どおりに表示されました。
物語の教訓:
- NUMBER は正しく計算および格納されます。バグを見つけたと思っ たら、何度も何度も真剣に考えてください。16 通りの方法でテストします。これが実際にはバグではないことをどのように証明できるかを考えてください。
- 使用するツールは、得られる結果に影響します。
共有してお楽しみください。