Page 1
PHPで雑に通貨クラスを
実装してみた結果
🤑
I implemented a Money class, and I'm sleepy.
2018-02-23 ピクシブ社内勉強会
公開日:
by USAMI Kenta @tadsan
PHPで雑に通貨クラスを
実装してみた結果
🤑
I implemented a Money class, and I'm sleepy.
2018-02-23 ピクシブ社内勉強会
お前誰よ
うさみけんた (@tadsan) / Zonu.EXE
伏線
金
日本で流通する最低
貨幣は一円硬貨
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
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
してた