小数計算で足し算は避けた方がいいんですかね,,?
そうですね、小数の計算はできるかぎり避けたほうがいいと思います。
たまに、誤差を許容してくれる問題もありますが…。
(ABC-117 A - Entrance Examination)
小数で誤差を生まないために私が思いつくのは、以下の3つの方法です。
①小数にならないように計算する
今回の例のように、小数になる掛け算などを後回しにして小数の計算誤差を生じさせなくすることができます。
print(0.3 - 0.2)
#0.09999999999999998
print((3-2)*0.1)
#0.1
②Decimalを使う
小数になるところをあらかじめdecimal型に変換しておいて、誤差を生じさせなくすることができます。
Decimalに小数を直接渡すときは文字列で渡すというところに注意が必要です。
from decimal import Decimal
print(0.3 - 0.2)
#0.09999999999999998
print(Decimal(0.3) - Decimal(0.2))
#0.09999999999999997779553950750
print(Decimal('0.3') - Decimal('0.2'))
#0.1
③マイナスを使った切り捨てを行う
こちらに詳しく解説された記事があります。
ARC-062 C-AtCoDeerくんと選挙速報: ceil関数の割り算に気をつけよう
import math
a = 111111111111111111
b = 9
print(math.ceil(a/b))
#12345679012345680 → 誤差が生じている
print(-(-a//b))
#12345679012345679
#DecimalでもOK
from decimal import Decimal
print(math.ceil(Decimal(a)/b))
#12345679012345679
Like!