何故プログラミングで小数の値がずれるのか

結論

小数に2進数で表現できないものが多くあるから。

どうして2進数で表現できない少数があるのか

例えば十進数で0.9の場合にそれを2進数で表現しようとすると、
小数点第一位 だと 1/2(0.5) 小数点第二位 だと 1/4(0.25) 小数点第三位 だと 1/8(0.125)と 少しずつ 0.5 + 0.25 + 0.125 = 0.875と0.9に寄っては行くが、
それをfloat型(単精度浮動小数点形式)の仮数部23回をおこなっても0.9と一致することはない。

検証JSコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var n = 0;
var nishinsu = 0.5;
var amari = 0.9;
var counter = 0;
while (n !== 0.9 && counter < 23) {
counter += 1;
if (amari >= nishinsu) {
n += nishinsu;
}
amari = amari % nishinsu;
nishinsu = nishinsu / 2

console.table({'counter':counter, 'number':n, 'amari':amari, 'nishinsu':nishinsu})
}