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

公開日:

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

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
してた