Page 1
PHPで雑に通貨クラスを実装してみた結果
🤑
I implemented a Money class, and I'm sleepy.
2018-02-23 ピクシブ社内勉強会
公開日:
by USAMI Kenta@tadsan
に東京都渋谷区のピクシブ株式会社で開催された『ピクシブ社内勉強会』で社内発表(20分)として発表しました。
PHPで雑に通貨クラスを実装してみた結果
🤑
I implemented a Money class, and I'm sleepy.
2018-02-23 ピクシブ社内勉強会
伏線
金
日本で流通する最低貨幣は一円硬貨
USで流通する最低貨幣は一セント硬貨
セントは1/100ドル$0.01と表記される
コンピュータで扱える数
PHPでは型が3つある
整数型 (int)
PHPの整数は signed int
ビット数はPHP_INT_SIZE最大値はPHP_INT_MAXで定義
概念上、この式で最大値が得られる2 ** (PHP_INT_SIZE * 8 - 1) - 1
浮動小数点数型 (float)
PHPの整数はdouble(IEEE 754 倍精度フォーマット)
型名としては(real)の別名もあるが、別に実数ではない
とても大事なこと
PHP_INT_MAX 9223372036854775807
PHP_INT_MAX + 1どうなる?
var_dump(PHP_INT_MAX + 1);//=> float(9.2233720368548E+18)
$bytes = PHP_INT_SIZE * 8;var_dump(2**($bytes-1)-1);//=> float(9.2233720368548E+18)
突然のfloat
そうです
PHPの演算子は整数演算でPHP_INT_MAXを超えるとfloatになります
😩
もひとつ大事なこと
浮動小数点は「ぴったり」の数を表現できない
https://ja.wikipedia.org/wiki/浮動小数点数#エラー(誤差)
浮動小数点数は概算で十分な計算に向く
誤差を許容できない用途には使ってはならない
われわれが欲するのは誤差が生じずに小数点以下を表現できる数
颯爽と現れる
BC Math 関数
http://php.net/manual/ja/ref.bc.php
http://php.net/manual/ja/function.bcadd.php
突然のstring
冷静になってほしい
文字列で入出力を表現すれば桁は落ちない
$scaleオプションで任意の精度を指定できる
裸の文字列のまま取り回したくない…
クラスを作ろう
https://github.com/zonuexe/kane.php
定石がある
https://martinfowler.com/eaaCatalog/money.html
https://martinfowler.com/eaaCatalog/money.html
よっしゃやってるで
MoneyはCurrency(通貨)と量(数)の組である
数字から金を作る
+, -, ×どうやって実装
まじめに書くと意外にめんどい
🤔
キラッとひらめいた
計算する処理はMoneyCalculatorトレイトに分割
ある程度の式は書けるように
二項演算を採用しなかったので優先順位の評価は一切不要
副作用として複数引数の処理が簡単になった
通貨計算ではLIStをProcessingする!
まとめ
雑に作った
実用性はない
MoneyPHPを使ったほうがいい
http://moneyphp.org/en/latest/
PHPで雑に通貨クラスを実装してみた結果
🤑
I implemented a Money class, and I'm sleepy.
2018-02-23 ピクシブ社内勉強会
LIStをProcessingしてた
