SlideShare a Scribd company logo
Pythonで小数計算を克服する
はんなりPython #32
2020/9/18@オンライン
あっきー
自己紹介
2
● 京都のIT会社で働いてます
● 業務では主に、AWS、Openblocks、SORACOM
などを使ってサービスを提供してます
● PythonはAWS Lambdaでバリバリ書いてます
最近は少しフロントエンドの開発にも慣
れてきました
ところで、、、
みなさんはPythonで小数点の計算を
したことがありますか?
あきたくーん
画面に表示されている小数の値が
おかしいみたいなんだけれど
確かにおかしいですね
想定している桁数以上の結果が
表示されてます。。。
な
ガタガタ(((゚Д゚)))ガタガタ
お
セ
そもそもプログラミングにおける小数とは
プログラミングにおける小数は2進浮動小数として扱うため小数を正確に扱うことができ
ない
例えば、0.1は浮動小数では正確に表現することができないため、計算結果が
想定通りにならないことがある
decimalを知る
小数を10進浮動小数で表現することができるため、小数計算における誤差を最小にする
ことができる
decimalの罠にかかる
floatからDecimalへの変換は文字列型を介して変換しないと、2進浮動小数で表現
されてしまう
ま
やった
Decimal使ったら万事解決やん
ダ
おか
しい
ゾ
ヒィィィィ∑(゚Д゚; )
decimalでも循環小数は対応できない
例えば、1 ÷ 3 の様に割り切れない計算が含まれる場合、計算リソースの関係で
正確に計算ができない
結局、有効桁数で丸めるしかないんや
乗算、除算が含まれる場合は正確に計算できないので、必要な有効桁数で丸め処理を実施
する必要がある
floatはダメな子なの??
Decimalも最終的に丸め処理が必要になるのであれば、floatで計算して最後に丸めても結果
は同じになる。
小数計算が加算、減算のみの場合はDecimalの場合は丸め処理が不要となるため正確に計
算が可能
ただし、乗算、除算が含まれる場合はDecimalも丸め処理が必要となるため、
floatで処理した場合とほぼ同じ結果になる(有効桁数によっては結果が変わる)
floatはダメな子ではなかった
丸め処理を実施すればfloatでも十分実用可能
さらに、Decimalよりもfloatの方が計算時間が短いため、通常利用ではfloatで全然
問題ない
まとめ
Pythonで小数を扱う場合は、誤差が発生することを念頭に、有効桁数での丸め処理を実施
すること
Decimalを使うと小数における加算、減算を誤差なく行うことができる
Decimalでの乗算、減算では誤差が発生するため、丸め処理が必要
floatでも十分実用可能、だたし小数の加減乗除全てにおいて丸め処理が必要になる
おまけ -fractions-
有理数計算ができる
有理数計算とは小数を整数の割り算として処理すること
fractionsを利用すると計算過程での誤差がない状態で計算することが可能
ただし、最終的にfloat等に変換する際に丸め処理で誤差が発生する
float、Decimalと比較すると処理時間がめちゃくちゃ遅い

More Related Content

More from hiroya akita

はんなりPython #45
はんなりPython #45はんなりPython #45
はんなりPython #45hiroya akita
 
Python 3.10の新機能を 俯瞰してみる
Python 3.10の新機能を 俯瞰してみるPython 3.10の新機能を 俯瞰してみる
Python 3.10の新機能を 俯瞰してみるhiroya akita
 
KyotoLT(Online) 第26回
KyotoLT(Online) 第26回KyotoLT(Online) 第26回
KyotoLT(Online) 第26回hiroya akita
 
AppSync導入のすすめ
AppSync導入のすすめAppSync導入のすすめ
AppSync導入のすすめhiroya akita
 
みんなのPython勉強会#62
みんなのPython勉強会#62みんなのPython勉強会#62
みんなのPython勉強会#62hiroya akita
 
変数の重要度ってどうやったらわかるん?
変数の重要度ってどうやったらわかるん?変数の重要度ってどうやったらわかるん?
変数の重要度ってどうやったらわかるん?hiroya akita
 
みんなのはんなりPython勉強会
みんなのはんなりPython勉強会みんなのはんなりPython勉強会
みんなのはんなりPython勉強会hiroya akita
 
Pythonでも型をつけたいだけの人生だった
Pythonでも型をつけたいだけの人生だったPythonでも型をつけたいだけの人生だった
Pythonでも型をつけたいだけの人生だったhiroya akita
 
Lt debian 20190526
Lt debian 20190526Lt debian 20190526
Lt debian 20190526hiroya akita
 

More from hiroya akita (10)

はんなりPython #45
はんなりPython #45はんなりPython #45
はんなりPython #45
 
Python 3.10の新機能を 俯瞰してみる
Python 3.10の新機能を 俯瞰してみるPython 3.10の新機能を 俯瞰してみる
Python 3.10の新機能を 俯瞰してみる
 
KyotoLT(Online) 第26回
KyotoLT(Online) 第26回KyotoLT(Online) 第26回
KyotoLT(Online) 第26回
 
AppSync導入のすすめ
AppSync導入のすすめAppSync導入のすすめ
AppSync導入のすすめ
 
みんなのPython勉強会#62
みんなのPython勉強会#62みんなのPython勉強会#62
みんなのPython勉強会#62
 
Hannari python#27
Hannari python#27Hannari python#27
Hannari python#27
 
変数の重要度ってどうやったらわかるん?
変数の重要度ってどうやったらわかるん?変数の重要度ってどうやったらわかるん?
変数の重要度ってどうやったらわかるん?
 
みんなのはんなりPython勉強会
みんなのはんなりPython勉強会みんなのはんなりPython勉強会
みんなのはんなりPython勉強会
 
Pythonでも型をつけたいだけの人生だった
Pythonでも型をつけたいだけの人生だったPythonでも型をつけたいだけの人生だった
Pythonでも型をつけたいだけの人生だった
 
Lt debian 20190526
Lt debian 20190526Lt debian 20190526
Lt debian 20190526
 

はんなりpython#32