布団が俺を呼んでいる

丘山大一のぶろぐ

さよならWindows Mobile

君は良い端末だったが、君の製造元がいけないのだよ。というわけでWindows Mobile OS は事実上撤退、開発中といわれるアンドロメダは情報が出てこない、しかして現在使用中のNuans Neo [もっと読む]

Microsoft Store で地味に薦めるもの

Microsoft Store を利用している人の話ってあまり聞かない気がします。以前は「アプリ少ねー!」「アプリ少ねー!」という声が聞こえていましたし、実際少なかったのですが、今はそれなりにあります [もっと読む]

PackageManagement に挑戦その2

今度は実際に入れてみる。使うプロパイダはChocokateyGet。powershellを管理者実行にして作業開始です。まず一つChocolateyGet を入れてみます。Install-Packag [もっと読む]

PackageManagement に挑戦

秋のOS見直し祭りにつき、諸々再インストール中。でも色々インストールしなおすのって面倒ですよね。というわけで、Windows のPackageManagement に初挑戦です。れっつとらい [もっと読む]

MSDNサブスクライバー期限延長

サブスクリプション期限は有効だけど、サブスクライバーの期限が切れていた。どういうこと?MSDNサブスクリプション契約は、契約する(サブスクリプション契約)契約を使用者に割り当てる(サブスクライバーにラ [もっと読む]

Linux マルチブート環境構築

秋は構築。USBをさしてディスクに直接インストールするに、パーティション切りなおすとて、三つ四つ、二つ三つなどやり直すことあはれなり。まいてGRUBのトラブルなどがつらいが、bootせざるは、いとをか [もっと読む]

Windows Server 2019 で Windows Subsystem for Linux 2 補足編

注意!執筆時点で、Windows Server 2019 は公開停止中です。ホスト、dockerイメージともに大幅に変わる可能性があります。前回のWSL登録の補足。手順その3のフォルダ決めの重要性につ [もっと読む]

Windows Server 2019 で Windows Subsystem for Linux

注意!執筆時点で、Windows Server 2019 は公開停止中です。ホスト、dockerイメージともに大幅に変わる可能性があります。とりあえず入れてみた編。公式ドキュメントこの辺り参照http [もっと読む]

Windows Server2019(公開停止中) で Windows Server コンテナ

注意!執筆辞典で、Windows Server 2019 は公開停止中です。ホスト、dockerイメージともに大幅に変わる可能性があります。Windows Server 2019 公開停止中。公開停止 [もっと読む]

技術書典5 参加はしないですけど販売する

技術書典は、多種多様なエンジニアが集う日本唯一の場所なんじゃないですかね。他のイベントは技術なりブランドなりの方向性がありますが、技術書典にはそれがない。という話はおいておいて当日参加はしませんが、「 [もっと読む]
布団が俺を呼んでいる | Firebird のお勉強 計算時の小数点以下の有効範囲

布団が俺を呼んでいる

丘山大一のぶろぐ

Firebird のお勉強 計算時の小数点以下の有効範囲

SQL上で計算した時の結果がどうにも理解できなくてはまりました。
しかし、同じことを考える人はいるもので。結論はStack overflow に出ています。

以下、ちょっと解説。

計算時の有効桁数具体例
Firebird の 計算時の小数点以下の有効桁数は、「計算に使用した型が持つ有効範囲」を足し合わせたものになります。
……と、こう書いても意味不明なので具体例。

SELECT cast (1/999999999999 AS numeric(18,13)) FROM HOGE;
SELECT cast (1.000000000000/999999999999 AS numeric(18,13)) FROM HOGE;
SELECT cast (1.000000/999999999999.000000 AS numeric(18,13)) FROM HOGE;
SELECT cast (1E0/999999999999 AS numeric(18,13)) FROM HOGE;

結果は、
0.0000000000000
0.0000000000010
0.0000000000010
0.0000000000010
となります。

1つ目は、分子・分母両方とも小数点以下が存在しません。そのため、計算時の有効桁数は「0 + 0 = 0」です。有効桁数が足りないので、結果表示時にnumeric(18,13)を指定しても、結果は「0.0000000000000」となります。
2つ目は、分子に小数点以下の桁数が存在しています。そのため、計算時の有効桁数は「12 + 0 = 12」です。
3つ目は、分子・分母両方に小数点以下が存在します。そのため、計算時の有効桁数は「6 + 6 = 12」です。
4つ目は、分子に「小数点以下を表示するための記号」である「E0」が指定されているため、計算時の有効桁数はdouble 型となるようです。

テーブルで確認してみる

簡単なテーブルを作成してみます。

CREATE TABLE HOGE(
    KEY_NO integer,
    VALUE_INT integer,
    VALUE_NUMERIC_SHORT numeric(18,1),
    VALUE_NUMERIC_LOMG numeric(18,13)
);
INSERT INTO HOGE VALUES(1,1,99999,99999);
SELECT cast (VALUE_INT /VALUE_NUMERIC_SHORT AS numeric(18,13)) FROM HOGE where KEY_NO = 1;
SELECT cast (VALUE_INT /VALUE_NUMERIC_LOMG AS numeric(18,13)) FROM HOGE where KEY_NO = 1;

結果はこうなります。
0.0000000000000
0.0000100001000

理屈は上記と一緒ですね。

無理矢理計算するなら、さらにCASTをかませるという手もなくはありません。

SELECT cast (VALUE_INT / (cast (VALUE_NUMERIC_SHORT AS numeric(18,13))) AS numeric(18,13)) FROM HOGE
where KEY_NO = 1;

こうすれば、
0.0000100001000
となります。


達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)

新品価格
¥2,592から
(2016/8/14 21:47時点)

コメントを書く