Excel (一般機能)

Excelの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2016)
小数での割り算について
投稿日時: 22/11/10 13:26:24
投稿者: pooka009

いつもお世話になります。
 
本日Excelの表を作成していて、困ったことが起こりました。
セルA1に「0.125」という数値が入っていて、セルB1にマスタから計算式で取得された「0.025」という値が入っています。(セルの内容は計算式が入っています)
 
この2つの値から余りを求めたいので、セルC1に「=mod(a1,b1)」と入力したところ、なぜか「0.025」という答えが返ってきました。(普通に考えたら余り0)
 
セルB1がいけないのか?と思い、念の為「=mod(0.125,0.025)」と打ってみても答えは同じ。いくつか試してみると、分母にくる数字が小数であると変な値が返ってくることが分かりました。
 
これってExcelの仕様なのでしょうか?
何か解決する方法(別の計算式でも構いません)をご存じの方、対策を教えて下さい。
よろしくお願いします。

回答
投稿日時: 22/11/10 13:40:37
投稿者: taitani
投稿者のウェブサイトに移動

うーん、仕様なのかもですね。
※私はあまり、小数点同士のあまりを求めないので、何ともですが^^;
 
回避策として、、、以下2点。
1:=MOD(A1*1000,B1*1000)/1000
2:=A1-B1*INT(A1/B1)
 
お試しください。

回答
投稿日時: 22/11/10 15:35:48
投稿者: QooApp

引用:
IEEE 754という浮動小数点演算*の規格に従うように設計されていて、例えば0.1なら2.8×10-17以下は切り捨てられる。
https://www.newssalt.com/32247

 
小数点以下の計算はエクセルでも昔から苦手な部分が多いように思います。
回避方法として提案できるとすれば、一度切り捨てたい部分までn×10倍し、小数点以下を切り捨ててしまう方法があります。
 
本件の場合、いったん125と25まで1000倍し、Mod処理を行うと正常に動作します。
それでも動作しない場合は小数点以下を切り捨てるROUNDDOWN(1000倍済みの値,0)で125に強制切り捨てすればよいかと思います。
 
その後、倍数分減らせば(1000分の1)元の基準に準じた値になるかと思います。

回答
投稿日時: 22/11/10 19:59:13
投稿者: 半平太

エクセルで小数を取扱うのはかなり厄介です。
 
小数には3種類の素性を持つものがあります。
 (1)真値:数学の概念と一致する、つまり2進数で完全に表し得るもの(例:0.5、0.375・・)
 (2)似値:2進数で完全に表しえないもの。ただ、エクセル君は真値と区別できない。(例:0.02)
 (3)誤値:似値を使って計算した結果値(=小数演算誤差含み値)。
      これは、エクセル君でも真値または似値と区別できる。
 
※(1)、(2)、(3)は、私の勝手な名称なので余所で使わないように。
 
 なお、マイクロソフトは独自の調整も行っており、逆に怖くて使えないと言う学者もいます。
 
 独自調整の例
 (1) A1セル =0.1+0.2-0.3  
   ユーザーは0になってウェルカムであるが、浮動小数点演算のルール違反である。
 (2) B1セル =(0.1+0.2-0.3)
   A1の数式をカッコで括っただけで、0にならなくなる。
 <結果図> 
 行 _A_  _____B_____
  1 0   5.55112E-17
 
>計算式で取得された「0.025」
0.025は、手入力しても似値であるが、計算で得られた小数なので誤値である。
※なお、いつもそうなる訳ではなく、そうなる可能性があると言うだけであるが、
 ユーザーは誤値として対処しなければ、正確な結果を得られる保証がなくなる。
 
>=mod(0.125,0.025) 
これは、誤値になる恐れがあるので、結果は保証されない。
 
>=MOD(A1*1000,B1*1000)/1000
これもB1が誤値なので結果は保証されない。
 
A1が真値の前提だとしても
 =MOD(A1*1000,ROUND(B1*1000,0))/1000
としなければならない。
 
>=A1-B1*INT(A1/B1)
これもB1が誤値であるし、A1/B1の部分が誤値なので、結果は保証されない。
 
  旨く行かない例を無理に作ってみると
(1) A1セル 0.125             (手入力なので真値)
(2) B1セル =0.025+IF(TRUE,0.1+0.2-0.3,0) (B1セルは0.025と見えるが、計算結果値なの誤値)
(3) C1セル =A1-B1*INT(A1/B1)   (誤値を使っているので結果は保証されない)
 
 <上記結果図>
 行 __A__ __B__ __C__
  1 0.125 0.025 0.025

投稿日時: 22/11/10 20:18:51
投稿者: pooka009

みなさん、早々のお返事、ありがとうございます。
そうなんですね。そういう仕様なんですね…。
とはいえ、Excelで小数が使えないというのは少し(かなり)残念です。
表計算ソフトなのになんとかしてくれ〜〜と思うのは私だけでは無かったわけですね。
 
皆さんからご教示いただいた代替策も参考にさせてもらいながら、作成していきます。
 
ありがとうございました。