Skip to content

PHPで雑に通貨クラスを実装してみた結果

公開日:

東京都渋谷区ピクシブ株式会社で開催された『ピクシブ社内勉強会』で社内発表(20分)として発表しました。

Download PDF

スライドテキスト

Page 1

PHPで雑に通貨クラスを実装してみた結果

🤑

I implemented a Money class, and I'm sleepy.

2018-02-23 ピクシブ社内勉強会

Page 2

お前誰よ

  • うさみけんた (@tadsan) / Zonu.EXE
  • GitHub/Packagistでは id: zonuexe
  • ピクシブ株式会社技術基盤チーム (pixiv.net)
  • Emacs Lisper, PHPer
  • Emacs PHP Modeのメンテナ引き継ぎました
  • 好きなリスプはEmacs Lispです
  • Qiitaに記事を書いたり変なコメントしてるよ

Page 3

伏線

Page 4

Page 5

Page 6

日本で流通する最低貨幣は一円硬貨

Page 7

USで流通する最低貨幣は一セント硬貨

Page 8

セントは1/100ドル$0.01と表記される

Page 9

コンピュータで扱える数

Page 10

PHPでは型が3つある

Page 11

整数型 (int)

PHPの整数は signed int

ビット数はPHP_INT_SIZE最大値はPHP_INT_MAXで定義

概念上、この式で最大値が得られる2 ** (PHP_INT_SIZE * 8 - 1) - 1

Page 12

浮動小数点数型 (float)

PHPの整数はdouble(IEEE 754 倍精度フォーマット)

型名としては(real)の別名もあるが、別に実数ではない

Page 13

とても大事なこと

Page 14

PHP_INT_MAX 9223372036854775807

Page 15

PHP_INT_MAX + 1どうなる?

Page 16

var_dump(PHP_INT_MAX + 1);//=> float(9.2233720368548E+18)

Page 17

$bytes = PHP_INT_SIZE * 8;var_dump(2**($bytes-1)-1);//=> float(9.2233720368548E+18)

Page 18

突然のfloat

Page 19

そうです

Page 20

PHPの演算子は整数演算でPHP_INT_MAXを超えるとfloatになります

Page 21

😩

Page 22

もひとつ大事なこと

Page 23

浮動小数点は「ぴったり」の数を表現できない

Page 24

Page 25

https://ja.wikipedia.org/wiki/浮動小数点数#エラー(誤差)

Page 26

浮動小数点数は概算で十分な計算に向く

Page 27

誤差を許容できない用途には使ってはならない

Page 28

われわれが欲するのは誤差が生じずに小数点以下を表現できる数

Page 29

颯爽と現れる

Page 30

BC Math 関数

Page 31

http://php.net/manual/ja/ref.bc.php

Page 32

http://php.net/manual/ja/function.bcadd.php

Page 33

突然のstring

Page 34

冷静になってほしい

Page 35

文字列で入出力を表現すれば桁は落ちない

Page 36

$scaleオプションで任意の精度を指定できる

Page 37

裸の文字列のまま取り回したくない…

Page 38

クラスを作ろう

Page 39

https://github.com/zonuexe/kane.php

Page 40

定石がある

Page 41

https://martinfowler.com/eaaCatalog/money.html

Page 42

https://martinfowler.com/eaaCatalog/money.html

Page 43

よっしゃやってるで

Page 44

MoneyはCurrency(通貨)と量(数)の組である

Page 45

Page 46

数字から金を作る

Page 47

Page 48

+, -, ×どうやって実装

Page 49

まじめに書くと意外にめんどい

Page 50

🤔

Page 51

キラッとひらめいた

Page 52

計算する処理はMoneyCalculatorトレイトに分割

Page 53

Page 54

Page 55

Page 56

Page 57

ある程度の式は書けるように

Page 58

二項演算を採用しなかったので優先順位の評価は一切不要

Page 59

副作用として複数引数の処理が簡単になった

Page 60

Page 61

通貨計算ではLIStをProcessingする!

Page 62

まとめ

Page 63

雑に作った

Page 64

実用性はない

Page 65

MoneyPHPを使ったほうがいい

Page 66

http://moneyphp.org/en/latest/

Page 67

PHPで雑に通貨クラスを実装してみた結果

🤑

I implemented a Money class, and I'm sleepy.

2018-02-23 ピクシブ社内勉強会

Page 68

LIStをProcessingしてた