本記事は、株式会社ギックスの運営していた分析情報サイト graffe/グラーフ より移設されました(2019/7/1)
目次
DBなどの数値型には登録できる範囲が決まっている
DB(データベース)やプログラミング言語にはデータ型と呼ばれる取り扱うことができる形式があり、その形式によって、持てる情報の種類、情報量などが違います。数値を入れるデータ型だけでも整数を登録する整数型、少数値まで登録できる実数型などあり、更に持てるデータの範囲(最大値/最小値)も様々あります。
これらのデータ型の特性を理解していないとDBのテーブルへの登録時にエラーが発生したり、情報を失う事が発生するなどの障害が発生する可能性があります。今回は、データ型によって発生する「桁あふれ」と「丸め」について対処方法を説明したいと思います。
桁あふれ:許容範囲以上の値を登録しようとした時に発生するエラー
「桁あふれ」は、DBやプログラミング言語の数値を登録可能なデータ型に対して、許容範囲以上の値を登録しようとしたときに発生するエラー処理です。このエラー処理が発生すると処理が中断しますので、データを登録することができません。
例えば、PostgreSQLの「integer」と呼ばれるデータ型では、整数の「-2,147,483,648 ~ 2,147,483,647」までの値を登録することが可能です。この範囲外の「-2,147,483,649」以下や「2,147,483,648」以上の値を登録しようとした時、integer型に登録できずにエラーとなります。(データ型名と許容範囲については、DB、プログラミング言語の種類によって異なります)
「桁あふれ」を発生させない方法
桁あふれの原因は、許容範囲以上の値を登録しようとするためです。そのため、DBなどのデータ型を、より広範囲をサポートするデータ型に変更すれば桁あふれは発生しなくなります。
例えば、PostgreSQLのinteger型で発生した桁あふれの場合、bigint型に変更することによって「-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807」までの整数を扱う事が可能になるため、桁あふれが発生しなくなります。また、登録できる桁数を指定するnumeric型などの場合は、1桁単位で登録できる許容範囲を調整できます。
丸め:許容範囲以上の細かい値を登録しようとした時に発生する情報の欠落
「丸め」は、DBやプログラミング言語の数値を登録可能なデータ型に対して、許容範囲以上の細かい値を登録しようとした時に発生する情報の欠落です。「桁あふれ」と異なりエラー処理が発生しないため、丸め処理に気づかない事があるため、注意が必要です。
例えば、PostgreSQLの「integer」と呼ばれるデータ型では、整数値しか扱う事ができません。また、numeric型などの桁数で登録できる許容範囲を指定するデータ型でも、小数点以下の桁数が決める必要があるため、それより細かい小数点以下の値は登録できません。このような、許容範囲外の細かい値の登録時に丸め処理が発生し、登録できない少数値は「切り捨て処理」などによって情報が削られてしまいます。
「丸め」を発生させない方法
桁あふれの対処方法と同様に許容範囲の幅広いデータ型に変更することも重要ですが、割り切れない割り算の結果登録には、どんなに小数点以下の桁数を多く持っても対処できない場合があります。このような場合は、計算の順番を考え、なるべく小数点以下の値が発生しないようにする事も重要です。