Excelで22222.09482と入力すると、数式バーに22222.0948199999の数値が表示されます


28

助けてください-セルに22222.09482の数字を入力すると、数式バーに別の数字22222.0948199999が表示されるという奇妙な状況があります。以下は問題のスナップショットです。

サンプルエラー

次の番号を入力すると、同じ動作が見られます。

22222.09482
33333.09482
44444.09482
55555.09482

しかし、11111.09482と66666.09482、77777.09482 ..を99999.09482まで入力すると、正しく表示されます。これが丸めに関連しているかどうかわかりませんか?丸めプロファイルを設定しませんでした。問題の解決にご協力ください。


1
きちんとした検索、私にとっても同じこと-あなたはちょうど使用できますROUND()か?=ROUND(A1,5)、データを値としてコピーして貼り付け、元の数字を削除しますか?
ブルースウェイン

1
@BruceWayne、興味深いことにROUND()正しい数字を示していますが、値としてのコピー/貼り付けは元の問題に戻ります!
レイJuna

1
@ReyJuna-その後ROUND(A1,5)、貼り付けた値をもう一度実行します。次に、それらを値としてコピー/貼り付けし、Round()再度コピー/貼り付けします。...:P ...それは興味深いです。@ EugenRieckには理由があるようです。いい質問です!
ブルースウェイン

1
22222.09482と22222.0948199999の違いを実際に気にしますか?これは、100兆分の5つの部分の違いです。
ラッセルボロ

4
浮動小数点演算は壊れていますか?。ただし、これdoubleはバグである可能性があります。これは、ほとんどの人が期待どおりに丸めたときに正しい値を示す十分な精度を持っているためです
-phuclv

回答:


31

これはバグです。

他の回答によれば、Excelは通常のIEEE倍精度表現を使用します。その精度は53桁の有効な2進数であり、約16桁の10進数に対応します。

最初の15桁の有効な10進数を表示することは常に「安全」です。15桁で指定された10進数の「表示された」数値は、15桁目の10進数を1つずつ変更することで得られた数値と安全に区別できるという意味で。たとえば、15桁の数字:

22222.09481 99999
22222.09482 00000
22222.09482 00001

3つの異なる倍精度数値にマップします。この特定の場合、これらの3つはいずれも倍精度表現の「隣接」にはなりません。

したがって、ユーザー表示の最初の2つを混同するのはExcelのバグです。

実際、このドメイン(16384〜32768)では、絶対精度は2 -38であり、次の数値を表現できます。

...
22222.09481 99998 96571 9714760780334472656250000
22222.09481 99999 00209 9502831697463989257812500 <-- the one closest to what Excel showed to the user
22222.09481 99999 03847 9290902614593505859375000
22222.09481 99999 07485 9078973531723022460937500
22222.09481 99999 11123 8867044448852539062500000
22222.09481 99999 14761 8655115365982055664062500
22222.09481 99999 18399 8443186283111572265625000
22222.09481 99999 22037 8231257200241088867187500
22222.09481 99999 25675 8019328117370605468750000
22222.09481 99999 29313 7807399034500122070312500
22222.09481 99999 32951 7595469951629638671875000
22222.09481 99999 36589 7383540868759155273437500
22222.09481 99999 40227 7171611785888671875000000
22222.09481 99999 43865 6959682703018188476562500
22222.09481 99999 47503 6747753620147705078125000
22222.09481 99999 51141 6535824537277221679687500
22222.09481 99999 54779 6323895454406738281250000
22222.09481 99999 58417 6111966371536254882812500
22222.09481 99999 62055 5900037288665771484375000
22222.09481 99999 65693 5688108205795288085937500
22222.09481 99999 69331 5476179122924804687500000
22222.09481 99999 72969 5264250040054321289062500
22222.09481 99999 76607 5052320957183837890625000
22222.09481 99999 80245 4840391874313354492187500
22222.09481 99999 83883 4628462791442871093750000
22222.09481 99999 87521 4416533708572387695312500
22222.09481 99999 91159 4204604625701904296875000
22222.09481 99999 94797 3992675542831420898437500
22222.09481 99999 98435 3780746459960937500000000 <-- the one closest to what the user types
22222.09482 00000 02073 3568817377090454101562500
22222.09482 00000 05711 3356888294219970703125000
22222.09482 00000 09349 3144959211349487304687500
22222.09482 00000 12987 2933030128479003906250000
22222.09482 00000 16625 2721101045608520507812500
22222.09482 00000 20263 2509171962738037109375000
22222.09482 00000 23901 2297242879867553710937500
22222.09482 00000 27539 2085313796997070312500000
22222.09482 00000 31177 1873384714126586914062500
22222.09482 00000 34815 1661455631256103515625000
22222.09482 00000 38453 1449526548385620117187500
22222.09482 00000 42091 1237597465515136718750000
22222.09482 00000 45729 1025668382644653320312500
22222.09482 00000 49367 0813739299774169921875000
22222.09482 00000 53005 0601810216903686523437500
22222.09482 00000 56643 0389881134033203125000000
22222.09482 00000 60281 0177952051162719726562500
22222.09482 00000 63918 9966022968292236328125000
22222.09482 00000 67556 9754093885421752929687500
22222.09482 00000 71194 9542164802551269531250000
22222.09482 00000 74832 9330235719680786132812500
22222.09482 00000 78470 9118306636810302734375000
22222.09482 00000 82108 8906377553939819335937500
22222.09482 00000 85746 8694448471069335937500000
22222.09482 00000 89384 8482519388198852539062500
22222.09482 00000 93022 8270590305328369140625000
22222.09482 00000 96660 8058661222457885742187500
22222.09482 00001 00298 7846732139587402343750000
...

さらに詳しく説明するに22222.09482は、1つのセルに入力し22222.0948199999、別のセルに(末尾の9を5つ)入力します。Excelは、上記の矢印で示されている2つのIEEE代表を選択する必要があります。そして、これら2つのセルの差を計算して取得できるので、そうなると思います9.82254E-11。ただし、両方とも同じように表示されます。

Excelで最初の 17桁が表示されていた場合、IEEE番号が10進数の「下」にあるものを正確に特定するのに役立ちます。その場合:

22222.0948199999 --> 22222.09481 99999 00
22222.09482      --> 22222.09481 99999 98

しかし、誤った方法で丸められた15桁を表示すると、誤解を招き、役に立たなくなります。


誰かがそれが意図的であると主張する前に、なぜ8.7同じ振る舞いを示さないのですか?に最も近い倍精度数8.7は次のとおりです。

8.69999999999999 93

そのため、8.69999999999999あたかもこれが意図的なものであるかのように表示されるはずです。しかし、そうではありません。


9
あなたは正しい、それはバグです。有効桁数が最も少ない2進浮動小数点数を変換するアルゴリズムは困難ですが、知られています。誰かが重要な詳細を見落としているようです。
マークランサム

2
@Ruslan浮動小数点演算、スタックオーバーフロー、その他のSEサイトで多くのスレッドを見てきましたが、実際の数に関係なく、(バイナリ)浮動小数点に関するあらゆる種類の一般的な真実と概念で答えを出すことがよくあります。動作がIEEEに準拠しているかどうかを確認します。「なぜ2.1 + 2.2戻るの4.80000001か」という質問を投稿できると思います。そして、それが浮動小数点を使用するときに期待しなければならないことであるという多くの答えを得ます。
ジェッペスティグニールセン

1
@benshepherd:LibreOfficeのスクリーンショットにExcelのスクリーンショットが表示されない
トーマスウェラー

1
@JeppeStigNielsen:2.1 + 2.2 = 4.8?わずか0.5オフです。正常です。
トーマスウェラー

@MarkRansom:それで、Excelは本当にそれ自体を実装していますか?ExcelはC ++またはその浮動小数点計算のために実装されていませんか?それはあなたが言っていることですか?または、C ++のバグはすでにあるので、何百万ものアプリケーションに影響しますか?
トーマスウェラー

22

Excelは、IEEE 754バイナリ64ビット浮動小数点形式で数値を保存します。キーは「ストア」です。実際の計算で使用されるときだけでなく、数値が格納されるたびに10進数から2進数への変更が行われます。

これに関する優れた記事は、浮動小数点の精度理解することです。別名「Excelはどうして間違った答えを返すのですか?」

多くの有効数字を持つ本当に大きな数字を扱うスプレッドシートプログラムを作成することは可能です。しかし、それはそれほど実用的ではありません。Excel IEEE 754 decimal128形式を使用するように設計されている可能性があり、これは34桁の10進数を許可します-22222.09482を格納するには十分です。しかし、代わりにはるかに一般的なbinary64 Double Precision形式を使用します。これは53ビットの精度で、16桁弱です。10桁のみの数字ではこれで十分だと思うかもしれませんが、10進数から2進数への変換は少し複雑になります。つまり、2222209482はbinary64数として100%正しく保存できますが、22222.09482はできません。

ことを覚えておいてください一般的にスプレッドシートは、財務データのために使用され、一般的に精度のように多くの桁数を必要としない、または精度の超高レベルが必要とされていないシナリオ、様々なモデリング「何であれば」について。確かに他のツール(およびおそらく他のスプレッドシートプログラムですが、最近検索したことはありません)は、既定または特別な構成設定でより大きい数値形式を使用できますが、Excelはそれらの1つではありません。

LibreOfficeがこれをうまく処理していると指摘する人にとっては、見た目は欺くことができます。詳細については、この投稿を参照してください。LibreOfficeは大きな数をわずかに異なる方法で処理しているように見えますが、基本的な64ビットの浮動小数点表現は同じで、同様の問題があります。


3
この答えは、OPの例の11111.09482のように、入力されたとおりに小数を含むいくつかの数値が表示されるという観察も説明している場合に適しています。
アンドリュー

11
ただの楽しみのために:IEEE 754のように、つまり正確にとして22222.09482保存されます。1.0101101100111000011000010001100001111110011111000000₂ * 2₁₀^(10000001101₂ - 1023₁₀)1.35632902954101553 * 2^1422222.0948199999984353787904
YoYoYonnY

1
Binary64(別名、倍精度)、10進数の10桁の数値には十分です。もちろん、それは正確に表現することができないが、ほとんどの数字は、含む0.20.1正確に表現することができない(画分1/5(1/5)バイナリ拡張を繰り返し無限大を有しています)。ただし、Excelではわかりにくい方法で表示されます。
ジェッペスティグニールセン

2
「通常、スプレッドシートは財務データに使用され、通常はそれほど多くの桁数の精度を必要としないことに注意してください」-これは一般的に非常に間違っています-財務データは「入力したものがそこに残ると予想されるもの」という意味で正確な動作が必要です"、10進数/バイナリ変換などは正しいですが、この特定の引数は無効です。財務データの場合、通常、何らかの種類MoneyまたはBigInteger形式を使用します。多くの場合、10進数のストレージ形式が使用されます。
ホンザジデク

4
この答えは、何が起こるかを説明するには不十分です。数値が誤ってフォーマットされいるExcelのバグを観察しています。22222.09482と22222.0948199999は、個別のbinary64番号です。
ルスラン

11

計算を行うとき、Excelは使用する数値の適切な内部バイナリ表現を見つける必要があります。あなたの場合、それは浮動小数点数を使用します。そして実際、このデータ形式はあなたの数に対して(非常に良い)近似を持っていますが、完全に一致していません。したがって、使用する出力形式を明示的にExcelに指定しないと、「ベストエフォート」が実行され、内部計算値に近い出力になりますが、入力したテキストとは異なります。

これを明確にするために:入力したテキストが数字を表し、数字のシーケンスを数字に変換することは、上記の「計算」の定義をすでに満たしていることを理解してください。

編集

私は十分に明確にしていないので、64ビット浮動小数点表現を使用する選択は実際には良いものだと考えています:Excelは科学者向けのツールではなく、小数点以下の11桁目の丸め誤差があります大きな影響がありますが、会計士は処理速度を数百万分の1に下げて、決して使用しない数字で現れる可能性のある不正確な計算の原因に対応することを望みません。

スプレッドシートプログラムを使用して設計されたものを使用し、明示的な出力フォーマットを使用して、それらの効果が表示領域に決して入らないようにする場合は問題ありません。


1
コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
DavidPostill

1
この答えは、何が起こるかを説明するには不十分です。数値が正しくフォーマットされていないExcelのバグを確認しています。22222.09482と22222.0948199999は、個別のbinary64番号です。
ルスラン

2

11111.09482および66666.09482、77777.09482 ..を99999.09482まで入力すると、正しく表示されます。これが丸めに関連しているかどうかわかりませんか?丸めプロファイルを設定しませんでした。問題の解決にご協力ください。

一部の数値は正しく表現できますが、一部は表現できません。

表示される精度を計算に適切に設定し、round()関数を使用します。

  • 説明:

  • 溶液:

    データに数値形式を適用する前に、表示される精度としてオプションを設定することにより、浮動小数点の丸めエラーが作業に影響するのを頻繁に防ぐことができます。このオプションにより、ワークシート内の各数値の値は、ワークシートに表示される精度になります。

    1. [ファイル]> [オプション]をクリックします。
      Excel 2007の場合:[Microsoft Officeボタン] Officeボタンの画像をクリックし、[Excelオプション]をクリックします。
      ボタン画像

    2. [詳細設定]をクリックし、[このブックを計算するとき]で[表示される精度を設定する]チェックボックスをオンにして、[OK]をクリックします。

    3. OKをクリックします。

    4. ワークシートで、書式設定するセルを選択します。

    5. [ホーム]タブで、[番号]の横にある[ダイアログボックスランチャーボタン]画像をクリックします。
      ランチャーボタンの画像
      Excelリボン画像

    6. [カテゴリ]ボックスで、[番号]をクリックします。

    7. [小数位]ボックスに、表示する小数点以下の桁数を入力します。

    ヒント:浮動小数点演算ストレージの不正確さの影響を最小限に抑えるために、ROUND関数を使用して、計算に必要な小数点以下の桁数に数値を丸めることもできます。

  • Journal of Accountancy-「Excelの計算エラーによるバグ」:

    特定の奇数は2進数の繰り返しを作成し、それらの繰り返し数字が15桁後に切り捨てられると、2進数は意図した数値に正確に変換されません。例として、Excelのすべてのエディションで、式22.26-21.29は0.97になりますが、代わりに0.970000000000002になります。試してみて、計算の問題を確認できるように、列の幅と小数点以下の桁数を増やすことを忘れないでください。

    このようなエラーは、意味のある計算エラーとして表れることはめったにないため、通常は重要ではないと見なされます。それにもかかわらず、潜在的な浮動小数点エラーを排除するために取ることができる2つの対策があります:

    1. ROUND関数。ExcelのROUND関数を使用して、計算値を目的の小数点以下の桁数に丸め、15桁の異常の可能性を排除します。たとえば、式= ROUND(-21.29 + 22.26,2)は0.97を正確に生成します。

    2. 精度。Excelの[表示精度]オプションをオンにすると、すべての数式で、表示されている数字に基づいて計算値を切り捨てて丸めることができます。

    Excel 2013、2010、および2007でこのオプションをオンにするには、[ファイル](または[Office Orb])、[オプション](または[Excelオプション])、[詳細]を選択し、[このブックを計算するとき]セクションで、[表示精度を設定]ボックスをオンにします。 OKをクリックします。

    Excel 2003、2002、および2000では、[ツール]メニューから[オプション]を選択し、[計算]タブの[ブックオプション]で[表示される精度]ボックスをオンにして、[OK]をクリックします。


1
説明は無関係です。予想数と取得数の差は28 ULPであり、自然な丸め誤差には大きすぎます。「解決策」は本当のバグを隠すだけです。
ルスラン

あなたの答えをサポートするいくつかのリンクとともに、コメントの代わりにあなた自身の答えとしてそれを投稿できたら素晴らしいでしょう。そうすれば、user954171の注目を集め、人々はそれに投票することができます。バグレポートへのリンクを提供できますか?
ロブ

関連するすべての数学的な詳細を含む回答が既にあります。バグのダンノは、しかしこれについて報告します。
ルスラン

0

ご存知のように、コンピューターは内部でゼロと1(別名ビット)のみを使用し、値を表す固定ビット数(通常は64ビット)を使用しています。つまり、表現できる異なる値の数は2の64乗です。確かにそれは膨大な数ですが、可能な値の数は有限であるため、すべての数値を表現できるわけではありません。それは正確に表現できない番号が検出された場合は、自動的にそれがいることを最も近いものに置き換えられますすることができます表します。それはあなたが見ているものです。


数値ベースの変換のためか、値ごとのメモリ量が制限されているためですか?どちらの場合も、あなたの推論は間違っています。技術的には、無限のメモリを想定して、任意の精度と任意の長さの数値を持つことは完全に可能です。例として、GNU bignumがあります。さらに、数値を不可逆形式でエンコードする必要はありません。したがって、コンピュータサイエンスの誤りでも、2進数でもありません。ユーザー入力に対して不可逆な数値エンコーディングを選択したのは、Excel開発者だけです。
フレネル

-1

コンピューターはバイナリで計算を行い、ほとんどの場合、非整数値には浮動小数点を使用します。浮動小数点で正確に表現できる唯一の小数値は、2の小数累乗の組み合わせ(1 / 2、1 / 4、1 / 8、1 / 16、1 / 32、...)の合計でなければなりません設計された精度の制限(通常53ビット)。これらの値は常に10進で整然とした正確な表現を持っているわけではありません。逆に、10進で正確に表現できる小数値のすべてが2進で正確な表現を持っているわけではありません。例:0.1。永遠に続かない、2の分数の累乗の合計として表すことはできません。

スプレッドシートに10進値を入力すると、変換されてバイナリに保存され、説明したようなケースがバイナリで表現できる最も近い近似値になります。表示されると、10進数に変換され、再び近似が必要になりますが、入力したものとまったく同じ表現に変換されない場合があります。

なぜ53ビット(ギブまたはテイク)なのか?「倍精度」浮動小数点を格納するための標準では、64ビットを使用するため、仮数(仮数とも呼ばれる)、符号インジケータ、および指数があります。通常、指数には10ビットが割り当てられ、符号には1が使用され、仮数部には53が残ります。これは保管用です。通常、計算は80ビットを使用して行われ、切り捨てられます。

特に丸めのアーティファクトが受け入れられない金額を扱う場合、コンピューターがベース10で動作する状況があります。


2
私は毛布のすべてのコンピューターの声明に同意しません。ストレージと計算に10進数形式を使用する博物館の作品を除いて、実際にはほとんど使用されていない多くのコンピューターがありました。BCD(Binary Coded Decimal)もあります。これは、Intel CPUでの使用制限など、最近の多くのCPUで使用されています。いずれも手元の質問に関係ありません-Microsoft Excelが数値を保存するために使用する方法で、すべてバイナリです。しかし、「すべてのコンピューター」は正しくありません。
マナセカッツ

「すべてのコンピューター」から「コンピューター」への変更が表示されます。「ほぼすべてのコンピューター」または「最新のコンピューター」などの方法を選択します。私は知っている-私はうるさいです。しかし、コンピューターもそうです:-)
manassehkatz-Reinstate Monica

@manassehkatzすべてのデジタルコンピューターは基本的にバイナリです。BCDは、10進数の算術演算を容易にするために、バイナリの上にある基本10構造です。
Zenilogix

すべてのデジタルコンピュータは基本的にバイナリですが、実際には、初期には10進数ベースのかなりの数がありました。しかし、BCDは基本的に10進算術を容易にするためにバイナリの上に10を基数とする構造であることに同意します。
マナセカッツ

この答えは、コンピュータのせいのように聞こえます。しかし、そうではありません。紙に書くことができる任意の数を正確に表すことができます(1/3を正確に表しますか?分数で保存する場合などは簡単です)。これは、Excelの作成者が数字を表すためにどの表現を選択したかに関するものです。
フレネル

-1

上記の多くが言ったように、これは内部表現エラーです。Excelは、倍精度の64ビット浮動小数点数を選択しています。これにより、2 64の可能な値が得られます。実数ドメインには無限の値が含まれているため、Excelで表現できない値を使用しようとすると、表現可能な最も近い値が使用されます。

私は、無限のメモリがあれば、どんな実数でも表現できるというコメントを見てきました。確かに、しかし「無限の記憶」のようなものはないので、これは論点です。他の人は、Excelはより大きな内部表現、たとえば128ビットを使用できたと述べています。確かに、コンピューターの方が、プロセッサのバスサイズに一致するビット数で表される数値に対して数学演算を行うのに優れていることがわかります。したがって、32ビットコンピューターは32ビット数の数学演算で最速になり、64ビットコンピューターは64ビット数の数学演算で最速になります。128ビットコンピューターが存在する場合、Excelが128ビットの数値表現に移行することを期待できます。それでも、非常に大きいが、表現できる数の限られたセットが提供されます。

スプレッドシートで数値がどのように表示されるかが懸念される場合は、一定の精度(小数)を使用すると、一貫した結果が得られます。入力した数字とExcelに保存されている実際の数字の違いが気になる場合は、心配する必要があります。違いは実際のものであり、エラーは計算を介して伝達されます。このエラーに悩まされていると思います。これはExcelの制限であり、一部の人が述べているバグではありません。すぐに変更される可能性は低いため、受け入れられない場合は、より高い精度で数値を表現できる別のスプレッドシートアプリケーションを探すことをお勧めします。ただし、そのようなアプリケーションを見つけたとしても、制限はまだあることに留意してください。異なるのはエラーのサイズだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.