見出し画像

[JS]0.1+1.1==1.2 これは間違いです。

0.1+1.1==1.2 
false 
そうです、この式は間違いであると言えます。
コンソールで聞いてみても答えはfalseが返ってきます。

では、なぜでしょう?

我々が0.1+1.1==1.2という数字が当たり前に知識としてあるのは我々が使う数字は基本的には10進数であります。
それは我々の指の数が10本であるからとここでは理解しましょう。

≫正確には10進数(十進法)は、数学や日常生活で最も一般的に使用される数の表現方法です。10進数は0から9までの10個の数字を表します。

本題に戻って
0.1や1.2は10進数に直すと1.2000000000000002のように小数点以下の数字が.0000000∞にコンピューターでは表されることになります。大体はある程度の数字で1.2000000000000002のように表現されない場合もありますがコンピューターはこのように精密な浮動小数点演算を行うものです。
なので 0.1+1.1==1.2 false と理解できます。
コンピューターサイエンスの講義でコンピューターは2進数であると習いますよね。この知識は非常に大切でコンピューターが常に2進数で我々との数字の数え方、考え方が異なると覚えておかなければいけません。
なぜならJSにかかわらず.0000の計算の誤差が積み重なるととんでもない事故が起きることもあるからです。

マリオがキラー大砲を避けるために毎秒、何回かに一回ジャンプするとします。0.1秒単位でジャンプをすることをプログラミングされたマリオはだんだんジャンプがずれてしまうんです。そのため何回目でマリオはキラーにぶつかってしまいます。その為コンピューターで浮動小数点演算はとくに重要視されている概念です。そのプログラミングがテスラだったら?北朝鮮のミサイルを打ち落とすpatriot missile systemであったら?人命にかかわるものをプログラミングしているのも我々ということですね。

シンプルに1+1=2ではいかないものがコンピューターというものですよね。でも、実際にあったミサイルの事件を知ると本当にこわくなりますよね。そういう意味でもコンピューターが何進数なのか、小数点以下は何マスまで表現できるのかJSに限らず知っておかなければいけない概念でした。



1.1 + 0.1 == 1.2
> false
왜냐면 10진법=>2진법 변환시 0.1은 순환소수.
메모리때문에 32칸에서 잘리므로 오차 발생.

1. 정확히 계산하려면 정수로 (예: 5.1달러 -> 5100센트)

2. Float 써야하는 상황이 생기면 반올림 문법 적절히 활용 precision = Math.pow(10,precision) Math.ceil(num*precision)/precision

3. double 자료형 : 숫자 1개당 64칸 사용 - 단점: 메모리 용량 2배

こちらから学習させて頂きました。本日も有意義な講義ありがとうございます。


小数計算の誤差 0.1 + 0.2 が 0.30000000000000004 になる理由 | あぱーブログ (apar.jp)

この記事が気に入ったらサポートをしてみませんか?