[Power BI] Power Queryの『型』を探る (3) number 蛇足

# IEEE 754

https://ja.wikipedia.org/wiki/IEEE_754

　ほぼすべてのコンピュータ・プログラムの浮動小数点算術は、IEEE754の仕様に準拠しています。インテルによって考案された浮動小数点の考え方が１９８５年に標準として制定され、２００８年に改定されています。正式名称は、IEEE Standard for Floating-Point Arithmetic (ANSI/IEEE Std 754-2008)です。

https://irem.univ-reunion.fr/IMG/pdf/ieee-754-2008.pdf

　この中で規定されている基本形式のうち、エクセルが実装しているのは64ビット二進浮動小数点形式（倍精度・double）で、以下のように符号部(sign)、指数部(exponent)、仮数部(fraction)の3つの情報に分かれます。

<a href="https://ja.wikipedia.org/wiki/IEEE_754">
<img width="600" src="https://upload.wikimedia.org/wikipedia/commons/thumb/a/a9/IEEE_754_Double_Floating_Point_Format.svg/618px-IEEE_754_Double_Floating_Point_Format.svg.png"/>
</a>

　すべてのコンピューターは、数値が格納されるメモリのビット数が定められており、格納できる最大または最小は有限です。

# 浮動小数点演算

https://learn.microsoft.com/ja-jp/office/troubleshoot/excel/floating-point-arithmetic-inaccurate-result

　ありきたりの数値と思われる 0.1 という値は、2進数では無限循環小数となってしまいます。値が無限に循環していますから、いつまでも終りがありません。

```
符号 = 0
指数 = 01111111011
仮数 = 1001100110011001100110011001100110011001100110011010.....
```

　つまり、浮動小数点演算で0.1を3回足した場合に0.3にならないという現象がみれます。
　エクセルのスプレッドシートでB1からB3までの0.1をB4でSUM関数を使って合計してやると、以下のように0.3になっています。このB4セルの値を0.3と比較しても、TRUEを表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/a203bcf4-0b14-956a-ec3c-2d1832cf6a90.png)
　しかし、エクセルブックを一旦保存し、エクセルの中に格納されている状態を見ると、以下のようになっています。

```xml:
<sheetData>
    <row r="1" spans="1:2" x14ac:dyDescent="0.4">
        <c r="B1">
            <v>0.1</v>
        </c>
    </row>
    <row r="2" spans="1:2" x14ac:dyDescent="0.4">
        <c r="B2">
            <v>0.1</v>
        </c>
    </row>
    <row r="3" spans="1:2" x14ac:dyDescent="0.4">
        <c r="A3" s="1"/>
        <c r="B3" s="1">
            <v>0.1</v>
        </c>
    </row>
    <row r="4" spans="1:2" x14ac:dyDescent="0.4">
        <c r="A4" t="s">
            <v>0</v>
        </c>
        <c r="B4" s="2">
            <f>SUM(B1:B3)</f>
            <v>0.30000000000000004</v>
        </c>
    </row>
</sheetData>
```
　「r="B4"」の値「v」は、0.30000000000000004 となっています。

　このエクセルをデータソースとしてPower Bで読み込んだ場合は、Power Query上では以下のように、0.30000000000000004　となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/ff07b72a-9575-3d9c-cc33-5850517b341e.png)

　0.3と比較してやると、以下のように False になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/64f4acb1-a6f3-b7c7-e900-35ca8c29844d.png)
　これを回避するには、値を固定小数点にして読み込めば、Trueになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/e91bb40f-cd83-84a0-1ea8-86f8acc379da.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/477b9f79-fad5-5dfb-bb62-dea0a293bb13.png)

# 一旦の結論

　浮動小数点データは、データモデルが大きくなる原因となり、計算が合わないことがあります。エクセルの数値データをエクセルに持ってくるには、

1. ファクトテーブルに浮動小数点の数値をできるだけ持ち込まない。
1. 小数点以下の数値が必要な場合は、小数点以下４桁を保持する固定小数点、通貨型で読み込む

　この２つを心がけてみてはいかがでしょうか。

# 関連記事
1. [[Power BI] Power Queryの『型』を探る (1) number](https://qiita.com/spumoni/items/9459635b69db773eca30)
1. [[Power BI] Power Queryの『型』を探る (2) text, temporal falimy](https://qiita.com/spumoni/items/ce38958d9858ea132a8f)
1. [[Power BI] Power Queryの『型』を探る (3) number 蛇足](https://qiita.com/spumoni/items/c46b3ddfb8173b6e9aa2)
1. [[Power BI] Power Queryの『型』を探る (4) null](https://qiita.com/spumoni/items/d8279858ceb627af8101)
1. [[Power BI] Power Queryの『型』を探る (5) カスタム型](https://qiita.com/spumoni/items/ec6893c9e4527b674b76)
1. [Power BIデータモデルの型システム (1) 数値型、日付／時刻型](https://qiita.com/spumoni/items/c73e465b691b15694ba0)
1. [Power BIデータモデルの型システム (2) テキスト型、論理型](https://qiita.com/spumoni/items/476494dc7818edc5e190)