Pythonは小数点の計算が苦手
小数点の引き算するとこうなる
>>> 1.0 - 0.1
0.9
>>> 1.0 - 0.2
0.8
>>> 1.0 - 0.3
0.7
>>> 1.0 - 0.4
0.6
>>> 1.0 - 0.5
0.5
>>> 1.0 - 0.6
0.4
>>> 1.0 - 0.7
0.30000000000000004
>>> 1.0 - 0.8
0.19999999999999996
>>> 1.0 - 0.9
0.09999999999999998
解決法の1つ:整数の計算は問題ないようなので1度整数倍にしてあげて後で戻す
>>> num_a = 1.0
>>> num_b = 0.7
>>> ((num_a * 10) - (num_b * 10)) / 10
0.3
>>> num_b = 0.8
>>> ((num_a * 10) - (num_b * 10)) / 10
0.2
>>> num_b = 0.9
>>> ((num_a * 10) - (num_b * 10)) / 10
0.1
round関数を使わずに小数点切り捨てする技
// 1を使う ※但し小数点以下の.0は残る
>>> 2837.20 // 1
2837.0
int()を使うと小数点以下の.0は消える
>>> int(2837.20)
2837
whileの条件で割り引いて0円になったら抜けるつもりが、0.xxxxxが永遠に続く
※intを設定したとしても、割合の計算の時点で、自動にfloatに変換され永遠に続く
>>> a = 150
>>> b = 70
>>> while(a>0):
a -= a * 70 / 100
print(a)
45.0
13.5
4.050000000000001
・
・
・
7.971615000000002e-05
2.3914845e-05
こういう時は上記の例を使って整数にして抜け出す
※割合計算でfloatにされたものをintに戻してあげることで、a>0の条件を設定できる
>>> a = 150
>>> b = 70
>>> while(a>0):
a -= a * 70 / 100
a = int(a)
print(a)
45
13
3
0
マイナスを含む割り算の注意点
仕様:Pythonの負の数の割り算は、割り切れない場合、商の値は0から離れた方の整数になる
10 // -3 は、少数にすると、-3.333...となり、この値を挟む-3と-4を比較して0からより離れた値になる
>>> 10 // -3
-4
-10 // 3も同じ
>>> -10 // 3
-4
また、Pythonの % による余りの計算は、割られる数 - 割る数 x 商、が行われるので、下記のような結果が出てくる
商が-4になるので、10 % -3 は、10 - {-3 x (-4)} と計算されて -2 となる
>>> 10 % -3
-2
同様に -10 % 3 は、-10 - {3 x (-4)} と計算されて 2 となる
>>> -10 % 3
2