• ベストアンサー

Excelの計算結果がおかしい

 A1セルには32.1という数値データが手入力されていて、B1セルには次の関数が入力されています。 =IFERROR(MAX(LEN(MOD(ABS($A1),1))-2,0),"")  通常であればB1セルには1が表示されている筈なのですが、何故か15が表示されてしまいます。  再計算を行っても、一旦保存してからExcelを閉じて再度Bookを開いても結果は変わりませんでした。  どなたか原因と解決方法をお教え願います。  尚、ExcelのバージョンはExcel2010です。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

  Excelの計算誤差が原因です MOD(ABS($A1),1)ここが具体的数値で書くとMOD(32.1,1)、つまり32.1÷1の余りで「0.1」を期待してるのでしょうが、実際は「0.100000000000001」になってます

kagakusuki
質問者

お礼

 御回答頂き有難う御座います。  その様な演算誤差がまさかMOD関数にまであったとは存じませんでした。  この御回答を拝見した後で確認してみましたところ、元の値が例えば1234567.8の場合には、MOD関数で小数部分のみを取り出そうとした場合、0.800000000046566になってしまう様ですので、ROUND関数では誤差を修正する事は出来そうにありません。  仕方がないので小数部分のみの取り出しは =IFERROR(MAX(LEN($A1)-LEN(INT(ABS($A1)))-1,0),"") 或は =IFERROR(MAX(LEN(TEXT(MOD(ABS($A1),1),"標準"))-2,0),"") で行う事に致します。

その他の回答 (2)

回答No.3

32.1のあまりが 0.100000000000001 となり長さは17になってしまいます。 中身を =$A1-TRUNC($A1) としても、同様です。 小数点以下の桁数を求めたいのであれば、視点を変えて =LEN($A1)-FIND(".",$A1)としてみてはいかがでしょう。 それから =IFERROR(LEN($A1)-FIND(".",$A1),"") としてはいかがでしょう?  

kagakusuki
質問者

お礼

 御回答頂き有難う御座います。  何故 =IFERROR(MAX(LEN(MOD(ABS($A1),1))-2,0),"") では小数部の桁数を正しく求める事が出来ないのかという事を知りたかったため、問題点の要素のみを取り出して質問するために質問文では >数値データが手入力されていて と述べましたが、実を言いますと実際のデータは 「『文字列』+『数値』+『文字列』」 という形式の文字列データとなっていて、その中から数値部分のみを取り出した上で、その取り出した数値の小数点以下の桁数を求め様としていたのです。  実はこの質問を投稿する前に、御回答頂いた方法と似た方法も考えてはいたのですが、その場合、 LEN(「元の文字列から数値部分のみを取り出す関数」)-FIND(".",「元の文字列から数値部分のみを取り出す関数」),"")  という様な形式となってしまい、「元の文字列から数値部分のみを取り出す関数」を2回記述しなければならず、関数が長くなってしまうため、「元の文字列から数値部分のみを取り出す関数」を記述する部分が1回で済むMOD関数を使おうと考えていた次第です。  ですから、回答No.1様の御回答に対するお礼欄では >=IFERROR(MAX(LEN($A1)-LEN(INT(ABS($A1)))-1,0),"") >或は >=IFERROR(MAX(LEN(TEXT(MOD(ABS($A1),1),"標準"))-2,0),"") >で行う事に致します。 と書きましたが、実際には =IFERROR(MAX(LEN($A1)-LEN(INT(ABS($A1)))-1,0),"") の方は使う予定は御座いませんし、heisukewada様にお教え頂いた方法も別の機会に使わせて頂く事に致します。

noname#239865
noname#239865
回答No.2

この関数「=IFERROR(MAX(LEN(MOD(ABS($A1),1))-2,0),"")」が 間違いでなければ、結果は表のとおりにしかなりません。

kagakusuki
質問者

補足

 「表のとおりにしかならない」からこそ、その「表のとおりにしかならない」原因を質問しています。  こちらが確認出来ている事柄を述べておられるだけでは回答になりません。

関連するQ&A

専門家に質問してみよう