0.1+0.2!=0.3背後の原理
1936 ワード
JavaScriptを初めて学んで、小数点(浮動小数点)の演算をする時、いつもこのような情況にぶつかります.
実際には、一定のプログラミングの基礎がある学生はすべて知っているはずです.コンピュータはバイナリで10進数を表しています.規則は
十進数から二進数にしても、八進法にしても、十六進法にしても、原理は同じです.即ち、基数連除(整数)または連乗(小数)
私達の最初の問題に戻りますと、JSはIEEE 754デュアル精度バージョン(64ビット)を採用し、IEEE 754の言語を採用する限り、前の問題があります.
IEEE 754標準はIEEE浮動小数点算術標準(IEEE Standard for Float-Proingt Arthmetic)の標準番号であり、国際標準ISO/IEC/IEEE 60559と同等である.IEEE 754標準は、コンピュータプログラム設計環境における2進数と10進数の浮動小数点の間の交換、算術形式および方法を規定している.
前に紹介した知識によると、0.1のバイナリは次のように表されています.
したがって、
参考内容:JavaScript toFixed()方法いくつかの高級前端面試験問題解析
0.1 + 0.2=0.30000000000000004
を覚えています.教程は教えてくれました.0.1 + 0.2
はJavaScript演算において、その値は固定されていません.勉強とテストの中で、だんだん発見できます.この値は毎回0.30000000000000004
であるようです.その時の勉強の中で、その和の値については固定的な言い方ではないかとだんだん疑ってきました.実際には、一定のプログラミングの基礎がある学生はすべて知っているはずです.コンピュータはバイナリで10進数を表しています.規則は
2, 2, 0 , ; 2, , 2, , 0 ,
です.たとえば:十進数から二進数にしても、八進法にしても、十六進法にしても、原理は同じです.即ち、基数連除(整数)または連乗(小数)
私達の最初の問題に戻りますと、JSはIEEE 754デュアル精度バージョン(64ビット)を採用し、IEEE 754の言語を採用する限り、前の問題があります.
IEEE 754標準はIEEE浮動小数点算術標準(IEEE Standard for Float-Proingt Arthmetic)の標準番号であり、国際標準ISO/IEC/IEEE 60559と同等である.IEEE 754標準は、コンピュータプログラム設計環境における2進数と10進数の浮動小数点の間の交換、算術形式および方法を規定している.
前に紹介した知識によると、0.1のバイナリは次のように表されています.
0.1 = 2^-4 * 1.10011(0011)// (0011)
0.2のバイナリは以下のように表されています.0.2 = 2^-3 * 1.10011(0011)// (0011)
前に述べたように、JSはIEEE 754の二重精度バージョン(64ビット)を採用し、64ビットの中で符号ビットが1位を占め、整数ビットが11位を占め、残りの52桁はすべて小数位である.0.1と0.2は無限ループのバイナリですので、小数位の末尾において、進数の有無を判断する必要があります.したがって、0.1のバイナリ表現(0.1 = 2^-4 * 1.10011(0011)
)は、ビットを進めると2^-4 * 1.10011(0011 * 12 )010
になり、同じ原理で0.2のバイナリ表現が得られる.この2つのバイナリを合わせて2^-2 * 1.0011(0011 * 11 )0100
を得ます.この値を10進数に換算すると0.30000000000000004
です.したがって、
0.1 + 0.2=0.30000000000000004
は、JavaScriptにおいて、その結果は一定ではない.0.1 + 0.2
と0.3
との関係を比較したいなら、どうすればいいですか?大学で数学分析、数値近似、または高校課程の代数について知識を証明している学生にとっては、自然に0.1 + 0.2
を差し引き、0.3
を一つの
より小さいと考えられます.例えば、私たちは彼らの差が0.0000000001
より小さいかどうかで彼らが同等かどうか判断できます.JavaScriptはまた、toFixed()
などのいくつかの原生方法を提供しています.Number四捨五入を小数点以下の桁数を指定する数字とすることができます.文法:NumberObject.toFixed(num)
パラメータ記述:num、必要です.小数点以下の桁数を指定すると、0から20までの値で、より大きな数値範囲をサポートできるようになる場合があります.このパラメータを省略すると、0で置換されます.参考内容:JavaScript toFixed()方法いくつかの高級前端面試験問題解析