- ベストアンサー
Excelの計算結果がおかしい
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
Excelの計算誤差が原因です MOD(ABS($A1),1)ここが具体的数値で書くとMOD(32.1,1)、つまり32.1÷1の余りで「0.1」を期待してるのでしょうが、実際は「0.100000000000001」になってます
その他の回答 (2)
- heisukewada
- ベストアンサー率57% (93/162)
32.1のあまりが 0.100000000000001 となり長さは17になってしまいます。 中身を =$A1-TRUNC($A1) としても、同様です。 小数点以下の桁数を求めたいのであれば、視点を変えて =LEN($A1)-FIND(".",$A1)としてみてはいかがでしょう。 それから =IFERROR(LEN($A1)-FIND(".",$A1),"") としてはいかがでしょう?
お礼
御回答頂き有難う御座います。 何故 =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様にお教え頂いた方法も別の機会に使わせて頂く事に致します。
この関数「=IFERROR(MAX(LEN(MOD(ABS($A1),1))-2,0),"")」が 間違いでなければ、結果は表のとおりにしかなりません。
補足
「表のとおりにしかならない」からこそ、その「表のとおりにしかならない」原因を質問しています。 こちらが確認出来ている事柄を述べておられるだけでは回答になりません。
お礼
御回答頂き有難う御座います。 その様な演算誤差がまさか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),"") で行う事に致します。