「S3 開発/SQL - S3.1 SQLコマンド(データ型)」からの出題です。
以下の説明から適切なものをすべて選びなさい。
select r*10 from test where id = 1 は必ず 1 を返す。
select n*10 from test where id = 1 は必ず 1 を返す。
select r*3 from test where id = 2 は必ず 1 を返す。
select n*3 from test where id = 2 は必ず 1 を返す。
select r - n from test; はどの行も0を返す。
※この例題は実際のOSS-DB技術者認定試験とは異なります。
例題公開日:2025年11月26日
PostgreSQLで小数点以下のデータを含む実数を表現するには、浮動小数点数のREAL(単精度)、DOUBLE PRECISION(倍精度)あるいは10進数のNUMERIC(またはDECIMAL)を利用することができます。
浮動小数点はデータをコンピュータの内部表現である2進数で扱っているため、高速な演算が可能ですが、0.1のような10進の小数を正確に表現することができず、例えば0.1を10倍してもそれがちょうど1になることが保証されません。
NUMERIC型は数値を10進数で表現するため、演算速度が遅くなりますが、演算の結果は正確になり、0.1の10倍はちょうど1になります。
一方で、1を3で割った結果(整数演算だとゼロになるため、例題では 1.0 / 3 としています)は0.3333.... となりますが、これは2進数でも10進数でも正確に表現することはできず、これを3倍してもちょうど1になることは保証されません。
0.1も1/3もREAL型とNUMERIC型でそれぞれ異なる値に表現されるため、r - n を計算したときに、これが0になることも保証されません。
したがって正解はBです。
1/10と1/3をそれぞれ10倍、3倍しても1になることが保証されない(誤差が含まれる)、というのはコンピュータで実数を扱う上での一般的な話ですが、データベースでは0.1など有限桁数の小数については、誤差なく正確に計算できる10進演算の仕組みがある、ということを理解しておいてください。
例題および解説は、ボランティアをはじめとした協力者によって作成されたものであり、実際の試験問題とは異なります。
※ご質問やご意見、誤記等のご連絡は、こちらまでお願いします。
※実際の試験問題に関するお問い合わせについてはご回答いたしかねます。あからじめご了承ください。
© EDUCO All Rights Reserved.