メメメモモ

プログラミング、筋トレ、ゲーム、etc

C - Multiplication 3

atcoder.jp

浮動小数点の理解があまかったせいでACできなかった。 100倍して計算結果を100で割るところまでは思いついたが、キャストの部分でも誤差が出ることを理解していなかった。

例えば 0.79の場合、2進数で表すと 0 .11001010001111010111000010100011110101110000101000111101... のように無限に繰り返される形になる。 これを10進数に表すと 0.789999999999999... といった数値になる。 これを 100 倍して小数部を切り捨てし、100で割ると 0.78 となる。

これを避けるために、四捨五入する必要があるため、切り捨てる際は 0.5 を足せば良い。

double A = 0.79;
long long a = (A * 100 + 0.5) / 100;