質問: 10進小数 0.1 の二進数展開は、無限循環小数 0.000110011001100・・・ となることが知られています。Excelは浮動小数点数をIEEE754規約に従って保持していると聞き及んでいるので、有限桁で打ち切られたその内部表現は、0.1よりもわずかに小さいか(以下、ケースA)、わずかに大きいか(以下、ケースB)、のいずれかのはずです。 ところが、あるExcelのセル、たとえば[A1]に0.1と入力し、そのセルを参照する形で、 `=ROUNDUP(A1,1)` を計算しても、`=ROUNDDOWN(A1,1)` を計算しても、結果はいずれも `(0.1, 0.1)` となります。これは、 * ケースAであれば、`(0.1, 0)` * ケースBであれば、`(0.2, 0.1)` になるはずだ、いう予想を裏切るものです。 Excelは、内部的にどのような計算をしていますか?
回答: 英語版のサイトで質問すると中の人が答えてくれるかもしれませんが、日本語版では難しいかもしれませんね。 こちらの記事と: Excelにも誤差がある? 浮動小数点演算誤差の正しい回避法 Tips: Excelでの数値表現と計算精度 Microsoftの記事の組み合わせで: Excel で浮動小数点演算の結果が正しくない場合がある 推測すると、以下のような状況だと思われます。 * セルに単独で直接の値を入力していると、仮数部が(doubleで表せる)15桁の範囲で、入力された値そのものになる。(何か調整がある?かは不明) * 何かの **演算結果** を格納したり表示したりするように設定していると、誤差が発生する場合がある。 * `ROUNDUP`, `ROUNDDOWN` は上記の値や結果に対して適用される。 質問の状況で、`A1`に入力する値を以下のように分けて、最初の紹介記事のように小数点以下の表示桁数を調節すると、違いが見られます。 * `A1`に`0.1`を入力(質問の状況) + `A1`の書式が標準だと`0.1`と表示 + `=ROUNDUP(A1,1)`は`0.1`と表示 + `A1`の書式を`数値`で`小数点以下の桁数`を`16`桁とすると`0.1000000000000000`と表示 * `A1`に`0.100000000000001`を入力(小数点以下15桁目に1) + `A1`の書式が標準だと`0.1`と表示 + `=ROUNDUP(A1,1)`は`0.2`と表示 + `A1`の書式を`数値`で`小数点以下の桁数`を`16`桁とすると`0.1000000000000010`と表示 * `A1`に`0.1000000000000001`を入力(小数点以下16桁目に1) + `A1`の書式が標準だと`0.1`と表示 + `=ROUNDUP(A1,1)`は`0.1`と表示 + `A1`の書式を`数値`で`小数点以下の桁数`を`16`桁とすると`0.1000000000000000`と表示 * `=ROUNDDOWN(A1,1)`は3つとも`0.1`と表示 3つ目はdoubleで表せる範囲を超えたので切り捨てられて、`0.1`を入力したのと同等になったのだと思われます。 その他に、最初の2つの紹介記事のように`A1`に`=3.8-3.7`とか`=4.8-4.7`と入力すると: * `A1`の書式が標準だと`0.1`と表示 * `=ROUNDUP(A1,1)`は`0.1`と表示 * `=ROUNDDOWN(A1,1)`は`0.0`と表示 * `A1`の書式を`数値`で`小数点以下の桁数`を`16`桁とすると`0.0999999999999996`と表示 になります。