【備忘録】int型・float型 と Decimalクラス あと平方根

python3
あくまで備忘録なんで雑に記録します

①Decimal使い方

小数点計算にはDecimal(十進固定及び浮動小数 型)が便利な様子
まずはそのままの小数をprint()

f = 0.1
g = 0.2
print(f, g)
#0.1 0.2 (そのままでは問題ない)

print(f + g)
#0.30000000000000004(二進数で処理しているから誤差が)

そこでDecimal

from decimal import Decimal as D

print(D(f) + D(g))
#0.3000000000000000166533453694(そのままDecimalでもダメ、str型が必要らしい)

print(D(str(f)) + D(str(g)))
print(D('0.1') + D('0.2'))
#0.3
#0.3

使い方は

①import decimal>>>decimal.Decimal(‘数字’)
②from decimal import Decimal>>>Decimal(‘数字’)
③from decimal import Decimal as D>>>D.(‘数字’)
のどれか

②どんな時に必要?

for i in range(100):
    print(i/100)
#0.01〜0.99まできれいにでる、ただし小数指定なしはfloatで認識していると思います

for i in range(100):
    print(1 + i/100)
#float+floatとか、float+intとか、演算すると誤差が生まれ、1.1400000〜とか変なのがでる

for i in range(100):
    print(1 + i)
#当たり前かもしれないけど int + int はきれい

for i in range(100):
    print(1 + D(str(i/100)))
#int + Decimal型はきれい
#小数になり得る場所をDecimal化するのかな

③int型やfloat型、Decimal型と平方根

・float/int と **0.5/math.sqrt(数)の組み合わせ
・Decimal と 数.sqrt()の組み合わせ
※書き方に注意

from decimal import Decimal as D
import  math
a = 1 + float(0.14)#1.1400000000000001
b = 1 + D('0.14')#1.14

print(a ** 0.5)#1.0677078252031311
print(math.sqrt(a))#1.0677078252031311
print(b.sqrt())#1.067707825203131121081152397

print(a.sqrt())#エラー
print(b ** 0.5)#エラー
まとめ

for i in range(n)内のi はint型
指定なし整数はint型
指定なし小数はfloat型
int型やfloat型の平方根は: **0.5 もしくは math.sqrt(数)
**0.5 は複素数とかもいけるらしい

Decimal化して十進数扱いの平方根は>数.sqrt()・・・違いに注意

コメント

タイトルとURLをコピーしました