web-dev-qa-db-ja.com

Excelでは、22222.09482と入力すると数式バーに22222.0948199999という数字が表示されます。

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

Sample error

次の数字を入力しても同じように動作します。

22222.09482
33333.09482
44444.09482
55555.09482

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

28
user954171

それはバグです。

他の回答によると、Excelは通常のIEEE倍精度表現を使用します。その精度は53桁の2進数で、これはおよそ16桁の10進数に対応します。

最初の15有効数字を表示することは常に「安全」です。 15桁で与えられた小数点以下の「提示された」数は、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
...

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

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

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

しかし、15桁を誤った方法で丸めて表示すると、誤解を招きやすく、役に立ちません。


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

8.69999999999999 93

意図的なものであれば、8.69999999999999として表示されます。しかしそうではありません。

31

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

これに関する素晴らしい記事は、 浮動小数点の精度を理解する、「Excelではどうして答えが間違っているのですか?」 です。

多くの有効数字を含む本当に大きな数を処理するスプレッドシートプログラムを作成することは可能です。しかしそれはひどく実用的ではありません。 ExcelIEEE 344 10進数を可能にする IEEE 754 decimal128フォーマット を使用するように設計できました - 22222.09482を格納するのに十分すぎるほど。しかし、代わりに、はるかに一般的な binary64倍精度 形式を使用します。これは、53ビットの精度を持ち、16桁未満です。 10桁から2進数への変換では少し複雑になります。つまり、2222209482はbinary64番号として100%正しく格納できますが、22222.09482はできません。

通常のスプレッドシートは、通常それほど多くの桁数の精度を必要としない財務データ、またはさまざまなシナリオでの「what if」モデリングに使用されることに注意してください。高レベルの精度は必要ありません。確かに他のツール(そしておそらく他のスプレッドシートプログラムですが、私は最近検索していません)がデフォルトであるいは特別な設定によってもっと大きい数値フォーマットを使うことができるけれども、Excelはそれらの一つではありません。

LibreOfficeがこれをより良く処理することを指摘している人にとっては、ルックスは欺くことができます。 詳細はこちらの投稿 をご覧ください。 LibreOfficeは大きな数をわずかに異なる方法で処理しますが、同じ基本的な64ビット浮動小数点表現を持っていて同様の問題を抱えているようです。

23
manassehkatz

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

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

EDIT

私は、64ビットの浮動小数点表現を実際に使用することを選択することを検討していることを十分に明確にしていません。Excelは科学者のためのツールとしては意味がありません。大きな影響はありますが、会計士は、使用することのない数で現れる可能性がある不正確な計算の原因に合わせて、処理速度を数百万分の一に短縮したくありません。

スプレッドシートプログラムを設計した目的のために使用し、明示的な出力フォーマットを使用してこれらの効果が目に見える領域にならないようにすると、問題ありません。

11
Eugen Rieck

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

いくつかの数字は正しく表現できますが、いくつかは表現できません。

計算に合わせて表示精度を適切に設定し、round()関数を使用してください。

  • 説明:

  • 解決策:

    データに数値フォーマットを適用する前に[表示精度]オプションを設定すると、浮動小数点丸め誤差が作業に影響を与えないようにすることができます。このオプションは、ワークシートの各数値の値をワークシートに表示されている精度に強制します。

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

    2. [詳細設定]をクリックし、[このブックを計算するとき]の[表示する桁数に合わせる]チェックボックスをオンにし、[OK]をクリックします。

    3. OKをクリックしてください。

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

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

    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]をクリックします。

2
Rob

ご存じのとおり、コンピュータは内部的にゼロと1(別名:ビット)のみを使用して動作し、値を表すための固定ビット数(通常は64ビット)を持っています。つまり、表現できるさまざまな値の数は2の64乗です。確かにそれは膨大な数ですが、可能な値の数は有限であるため、すべての数を表すことはできません。正確に表現できない数に遭遇すると、それは表現できる表現に最も近いものに自動的に置き換えられます。それがあなたが見ているものです。

0
Javier Alvarado