たれぱんのびぼーろく

わたしの備忘録、生物学とプログラミングが多いかも

JavaScriptのNumber: 2進数表現の不思議

まとめ: Numberは適当に使うと痛い目にあうよ

変な振る舞い

入力した数値が勝手に変更される.

console.log(1.01234567890123456789);
// 1.0123456789012346

「ああ、有効数字(小数点の桁)の話?」と思いきや、もっと不思議な振る舞いをする.

for (let i =0; i<10;i++){console.log(parseFloat(`${10**i}.01234567890123456789`));};

//         1.0123456789012346
//        10.012345678901234
//       100.01234567890124
//      1000.0123456789013
//     10000.0123456789
//    100000.0123456789
//   1000000.0123456789
//  10000000.01234568
// 100000000.01234567
//1000000000.0123457

どうしてこうなった?

二進数による少数表記の限界.
JavaScriptのNumberは二進数で数字を持っている、これが原因。
JavaScriptダメダメやな」と感じた人はプログラミング言語が一般にどうやって数字を表現するのか勉強するとよい。

ちなみにfloat (浮動小数点) はまた別の話(decimal/十進数のfloatもある)。