[[20260529174132]] 『合計が0.8になったら1とカウントしたい』(限界事務員) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『合計が0.8になったら1とカウントしたい』(限界事務員)

合計が0.8になったら1と表示がでるようにしたいです。

例えば、A1〜A10までが値入力セルで、A11に合計表示するとして、
A1に0.2と入力→A11に0.2と表示
A2に0.6と入力→A11に1と表示
A4に0.4と入力→A11に1.4と表示
A7に0.4と入力→A11に2と表示

といったようなエクセル関数は組めるのでしょうか?
難しければ潔く手打ちします。
どうかご教授願います。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


 =BASE(SUM(A1:A10)*10,8)/10
(はてな) 2026/05/29(金) 18:18:58

 あくまで提示の例の場合です
(はてな) 2026/05/29(金) 18:39:47

0.7
0.2
0.7
0.2
という4つの数値が入ったらA11はどのように変化していきますか?
(確認) 2026/05/29(金) 18:43:09

 =INT(SUM(A1:A10)/0.8)+MOD(SUM(A1:A10),0.8)
の方が良いのかな?
(はてな) 2026/05/29(金) 19:00:04

 >・・の方が良いのかな?

 確認さんの挙げたサンプルで試してみました?

(小数演算誤差) 2026/05/29(金) 20:47:43


遅くなってしまって申し訳ありません!
諦めて今日のところは帰宅してしまったため、月曜日早速打ち込んでみます!
ありがとうございます!!
また月曜日にご報告にきます!
(限界事務員) 2026/05/29(金) 22:19:52

 =INT(SUM(A1:A10)/0.8)+SUM(A1:A10)-INT(SUM(A1:A10)/0.8)*0.8
 とか?

 A1 = 0.7
 A2 = 0.1
 A3 = 0.6
 A4 = 0.2
 も、試した方が良いかも・・・
(通行人) 2026/05/30(土) 09:35:44

 【後日追記:この発言には誤りがありましたのでスキップ願います。】

 すでに はてなさんの提案された方式でよさそうですが、
 小数演算誤差さんのご指摘のとおり
 以下のようにするとよいでしょう。

 対象の数値は、仮にA1から下に順次入れるとして、
 小数点誤差を考慮して
 =BASE(INT(SUM(A1:A10)*10),8)/10
 とすればよいと思います。

 今のようにバラバラな場合、
 =BASE(INT((A1+A2+A4+A7)*10),8)/10
 のような式にする必要がありますね。

 どんな内容の数値なのかわかりませんが、毎回の計算結果は別セル(例えばB列)に書き出したほうが
 検証可能性も高いような気がします。

       A列     B列
 1行           =BASE(INT(SUM(A$1:A1)*10),8)/10
 2              下にコピーします。
 3
 ・・
  9
 10    
(xyz) 2026/05/30(土) 15:35:12

 小数点以下 1桁限定の入力ならば、
  =BASE(INT(SUM(A1:A10)*10),8)/10
 とか、
  =DEC2OCT(INT(SUM(A1:A10)*10))/10   ← これは邪道か〜

 小数点以下 2桁以上の入力も有り得るのなら、
  =INT(SUM(A1:A10)/0.8)+SUM(A1:A10)-INT(SUM(A1:A10)/0.8)*0.8
 とか、上の式を丸めて、
  =SUM(A1:A10)+INT(SUM(A1:A10)/0.8)*0.2

 って感じでしょうかね。
(通行人) 2026/05/31(日) 08:25:54

>毎回の計算結果は別セル(例えばB列)に書き出したほうが
>検証可能性も高いような気がします。
やってみました。
質問者さん、こんな感じでしょうか。

     |[A]|[B]
 [1] |0.2|0.2
 [2] |0.6|  1
 [3] |0.4|1.4
 [4] |0.4|  2
 [5] |   |   
 [6] |0.7|0.7
 [7] |0.2|  1
 [8] |0.7|1.7
 [9] |0.2|  2
 [10]|   |   
 [11]|0.7|0.7
 [12]|0.1|  1
 [13]|0.6|1.6
 [14]|0.2|  2

B1=A1
B2=IF(MOD(B1+A2,1)>=0.8, CEILING(B1+A2,1), B1+A2)
↓へコピー

(関数苦手) 2026/05/31(日) 11:23:37


 小数演算の誤差を考えると、加算してから整数化するより
 整数化してから加算した方が有利だと思うので、

 =BASE(SUM(A1:A10*10),8)/10
 とか
 =BASE(SUM(A1:A10*80),8)/100
 という式でもいいかと思います
(´・ω・`) 2026/05/31(日) 11:30:57

追伸
どのように変化するかの検証でした。
(関数苦手) 2026/05/31(日) 12:03:43

 限界事務員さんへ

 上の方で注釈がありませんが、
 合計値 6.4 以上で
 10になるものと8になるものがありますので
 テストすることをお勧めします。

 全部見てませんが
 =SUM(A1:A10)+INT(SUM(A1:A10)/0.8)*0.2 → 6.4は8
 =BASE(SUM(A1:A10*80),8)/100 → 6.4は10

 6.4まで行かないとかそういうのであれば区別する必要はありませんが。
(ちくわ) 2026/06/01(月) 10:05:45

 なるほど、合計が大きい数値になる場合はBase関数を使ったものは使えないですね。
 気合が入っていなかった。2026/05/30(土) 15:35:12の発言は撤回します。

 提案のありました
 =SUM(A1:A10)+INT(SUM(A1:A10)/0.8)*0.2
 が固いのかなと思います。

 ひょっとして現在の手計算のロジックが別のものかもしれませんので、
 現状計算と提案計算をよくよく比較することを推奨します。
(xyz) 2026/06/01(月) 12:24:45

皆様、たくさんのお返事ありがとうございます!
遅くなってしまい、申し訳ありません!

=SUM(A1:A10)+INT(SUM(A1:A10)/0.8)*0.2

こちらの式で表示がうまくいきました!!
本当にありがとうございました🙇‍♀️!
(限界事務員) 2026/06/03(水) 08:11:28


 解決してよかったですね。^^

  分かる方にちょっと教えていただけると有難いのですが、

  1.=BASE(SUM(A1:A10*10),8)/10 の「SUM(A1:A10*10)」の部分ですが、
    本問の例だけでなく、一般的に(例えば小数点以下2桁の場合なら100倍で)確実に整数化するのですか?

  2.=SUM(A1:A10)+INT(SUM(A1:A10)/0.8)*0.2 の「INT(SUM(A1:A10)/0.8)」の部分ですが、
    小数演算誤差のセイで僅かに整数になりそこなって、1小さく出るなんてことはないのですか?
      ~~~~|~~~~
        ↓ 二つ絡んでくるかも知れないと思っております。

      SUM(A1:A10) と INT(・・/0.8) 

(半平太) 2026/06/03(水) 13:21:13


 分からないけど回答するんですが

 IEEE754の仕様通りであれば
 ほしい桁数より多い桁まで上げてから 割り戻せば
 有効桁範囲内で誤差は許容範囲内になるはずですが
 excelの仕様はちょっとわからないです。

 baseの返り値は文字列なので誤差は出ないような気もします。

 >一般的に(例えば小数点以下2桁の場合なら100倍で)確実に整数化するのですか?
 小数点2桁の場合は1000倍じゃないですかね?
  0.xxy の時はyで丸めたいので
(ちくわ) 2026/06/03(水) 14:23:36

 分かっているわけではないので、個人的な意見です。

 1.>確実に整数化するのか

    100%確実ではないと思いますが、加算することで誤差が積み上がるので、
  1つの数値に対して、0.1×10が1にならないような経験は今までありません。

    10倍とか100倍ではなくて、16倍とか128倍とか 2^n倍する方が、
    浮動小数の桁の部分だけ増減するので精度の問題は低減されると思います。

    Base関数に与える数値は整数でないとうまくいかないので、2^n×5倍で考えました

 2.>1小さく出るなんてことはないのですか
    一般的な話としては、ありえると思いますが、
  私にはこの値の組み合わせでそうなるという事例を示すことができません
  この質問では、加算する数値が0.1単位で10個までの限定でなので、問題にならないのかもしれません
(´・ω・`) 2026/06/03(水) 14:37:06

 ちくわさん、(´・ω・`)さん

 ご回答ありがとうございます。

 質問の趣旨が不明瞭ですみません m(__)m

 本問の事例に限定した話ではなく、
  「1. 単一小数点数は単純な桁上げだけで100%整数化するのかどうか」
  「2. INT関数での処理上、演算誤差の配慮が必要ないかどうか」
 についての疑問です。

 なので、BASE関数自体に因んだ事象は主題から外れます。

 その後、上記1 については、幾つかの実験をしたところ、
 100%確実とは言えない事例を発見しましたので解決しました。
 ※A1に0.0003を入れて、=A1*10000-3+0.5^51=0 でTRUEが返りました。

(半平太) 2026/06/03(水) 16:10:18


 半平太さんのご質問はそのとおりで、全然"固く"なかったです。
 2点ともそうしたことは起きますので修正が必要でした。
 正解をお願いいたします。
(xyz) 2026/06/03(水) 16:38:44

 > 正解をお願いいたします。
 いやー、本問の事例では問題ないだろうと思っています。

 IEEE 754(浮動小数点数の算術規格)では4つの丸め方法があるようで、
 INT関数は、その内、演算誤差くらいでは誤動作しないような方式が採用されている節があるのですが、
 私は理解できなかったので、分かっている方に解説して頂こうと思った次第です。

 ただ、こういった検討をする事自体が苦痛なので、私ならですが、
 水増し(今回の事例では0.001程度)して簡単・確実に桁落ちを防止するとか、
 Round関数を使って確実な整数化をしてから、ノーマルに解を求める数式にしますね。

 水増しの例 =SUM(A1:A10)+INT(SUM(A1:A10,0.001)/0.8)*0.2 

(半平太) 2026/06/03(水) 17:33:29


 ありがとうございました。質問者さん、提示された正解版を使用して下さい。
(xyz) 2026/06/03(水) 17:51:08

 上の方で的外れな返答をして申し訳ないです。
 この返答も質問に合致しているのかわかりかねますし、
 無駄に長文になってしまいましたが質問も閉じていますので投稿します。

 長くなったので要約:
 IEEE754はCPUの規格なので
 計算結果をどう使うかはexcelの仕様によるのでよく知りません。

 >「1. 単一小数点数は単純な桁上げだけで100%整数化するのかどうか」
 これは 人が入力したい値を正確に再現して演算できるか?ってことでしょうか
 もともとメモリ上に保存された時点で
 16桁目の偶数丸めで一致する近似値として保存するので
 2進数で誤差が出る少数を入力した時点で誤差が発生します。
 2進数の近似値を真とすれば常に整数化できます。

 >「2. INT関数での処理上、演算誤差の配慮が必要ないかどうか」
 目的誤差に寄ります。 
 厳密計算が必要な場合は10進計算を使えとなっています。
 (調べたら754に統合されてました)
 なんなら 割り算をするだけで誤差が出るようなアプリもあります。
 割り算より掛け算の方が早いので実行速度が欲しいアプリを書く際のテクニックですが
 そういうアプリでは 6/3 - 2 = 0 -> true にならないことはままあります。
 切り捨てでいいか偶数丸めがいいかはCPUを使う側が考えることなので
 CPUの計算処理を規定する754の指定範囲外です。

  >  INT関数は、その内、演算誤差くらいでは誤動作しないような方式が採用されている節があるのですが、
 INTが特殊な処理をしているかは存じていませんが規格通りであれば
   MS learn を見ると INT関数 = -無限への近似なので
 そんなことはないと思います。 
  -無限への近似は桁上げの計算が不要になる速度を優先した整数化なので誤差は考慮されてません。

 754でいうところの誤動作は excelだと計算の度に結果が変わる ことを指します。
 > ※A1に0.0003を入れて、=A1*10000-3+0.5^51=0 でTRUEが返りました。
  この結果が 展開されたメモリの位置とか計算スタックの処理順で 結果が変わること が誤動作です。

 関数がどういう処理しているのかについては浅い知識しかないので
 excelでどういう扱いになっているかわわからないです。
 ws.round関数とVBA.round関数の処理違うとかもここの掲示板で知りましたし。

(ちくわ) 2026/06/04(木) 10:27:41


 ちくわさん

 詳しいご説明、ありがとうございます。
 私のレベルでは付いていけない部分がありますが・・

 > >「1. 単一小数点数は単純な桁上げだけで100%整数化するのかどうか」
 > これは 人が入力したい値を正確に再現して演算できるか?ってことでしょうか
 > もともとメモリ上に保存された時点で
 > 16桁目の偶数丸めで一致する近似値として保存するので
 > 2進数で誤差が出る少数を入力した時点で誤差が発生します。
 > 2進数の近似値を真とすれば常に整数化できます。

 いえ、私の主旨は、小数(例:1.11)を入力して2進数の近似値となったデータを
 単に100倍する様な操作をするだけで、ピュアな整数(111)に仕立て上げられるのか、と言う疑問です。

 これについては、そうならない例が幾らでも出てきたので、それは言えないとの結論で解決しています。
 ※なお、0.1〜0.9の9個については、10倍することでピュアな整数(1〜9)になっていました。

 > >「2. INT関数での処理上、演算誤差の配慮が必要ないかどうか」
 > 目的誤差に寄ります。 
 > 厳密計算が必要な場合は10進計算を使えとなっています。
 厳密計算以外は、私の頭にありません。(限界事務員さんもそうだと思います)

 >  -無限への近似は桁上げの計算が不要になる速度を優先した整数化なので誤差は考慮されてません。
 知識がなくて全く理解できませんが、「誤差は考慮されてません」の部分だけで十分です。

 > 754でいうところの誤動作は excelだと計算の度に結果が変わる ことを指します。
 > > ※A1に0.0003を入れて、=A1*10000-3+0.5^51=0 でTRUEが返りました。
 >  この結果が 展開されたメモリの位置とか計算スタックの処理順で 結果が変わること が誤動作です。
 すみません。そうなんですか・・・という言葉しか出ません。

 > excelでどういう扱いになっているかわわからないです。
 これは、一般ユーザー共通ですね。
 分かった気になっていても、仕様書を見せてもらった人はいないので。

 大変、ありがとうございました。 m(__)m

(半平太) 2026/06/04(木) 20:03:03


お礼を申し上げた後も皆様からたくさんの考察をいただいて、少しのびっくりと感謝です!
一通り目を通させてもらいましたが、正直私の頭のレベルでは全くついていけず…お恥ずかしいです。

今の所、0.1毎のカウント予定なので、以前採用させていただいた関数で問題はなさそうに思えます!
今後あるとすると、0.15毎のカウントが出る可能性はあります。
例えば、A1→0.1 A2→0.15 A4→0.5 A6→0.05 A11に1が表示される
といった内容です。
あくまで予定なので、このまま変わらず0.1毎ごとのカウントでいくと思います
そして最大でも40までが最大値になります。

余談なのであまり気にせずで大丈夫です!
皆様本当にありがとうございます!!
(限界事務員) 2026/06/04(木) 23:53:12


 [6] |0.7|0.7
 [7] |0.2|  1
 [8] |0.7|1.7
 [9] |0.2|  2
 [10]|   |   
 [11]|0.7|0.7
 [12]|0.1|  1
 [13]|0.6|1.6
 [14]|0.2|  2
>>どのように変化するかの検証でした。
再度確認、これで合っていますか。
(関数苦手) 2026/06/05(金) 10:16:13

 関数苦手さんへ

  [6] |0.7|0.7
  [7] |0.2|  1 ←なぜ、1.1 じゃないのですか?
  [8] |0.7|1.7  ←なぜ、2.0 じゃないのですか?
  [9] |0.2|  2 ←なぜ、2.2 じゃないのですか?

 限界事務員さんも
 >=SUM(A1:A10)+INT(SUM(A1:A10)/0.8)*0.2
 >こちらの式で表示がうまくいきました!!
 と言っているのですが・・

 xyzさんへ

 少し知識が増えましたので、Copilotに聞いてみました。

 INT関数では、エクセルの15桁丸めが適用されるので、小数演算誤差なんて微差は
 丸め段階で吸収されてしまい、実務上問題になることはほぼないとの事でした。

 つまり、0.799999999/0.8 なんてものは、結局0.8/0.8で計算される。
 また、(0.8*そこそこ大きい整数)/0.8 の計算で小数演算誤差が出ても
 結局ここでも、結果数値が丸めで正しい値に修正されてしまうらしいです。

 なので水増しする必要はなさそうです。m(__)m
 ま、私自身は毎回こんな検討するのはしんどいので水増ししちゃいますけども。

 なお、QUOTIENT関数だとそうは行かず、内部数値がもろに使用されるので
 シビアに繰り上げミスを起こす、との事でした。

(半平太) 2026/06/05(金) 15:19:09


 そうですか、生成AIのいうことは怪しいことがあるので注意が必要ですね。
 実際に動作させて確認したものだけが信頼できるものだと思います。
 いずれにしても情報ありがとうございます。

(xyz) 2026/06/05(金) 15:30:20


半平太さん
指摘ありがとうございました。
『0.8になったら1』を『0.8を超えたら1』にすると解釈してしまいました。
質問者さんそういう訳でスルーしてください。
(関数苦手) 2026/06/05(金) 15:54:57

 > INT関数では、エクセルの15桁丸めが適用される 
 ハルシネーションだと思って確認したら
 ホントに丸めてから処理しているみたいです。
 ただ最近追加された?らしく
 前はちゃんとint(0.29/0.01) -> 28 だったようですが
   //excelでそうなるというセルの画像付きのものが確認できませんでした。
 今は int(0.29/0.01) -> 29 となりました。

 シートの表示に合わせる丸目処理してから切り捨てになったらしいです。

 A1:=0.29/0.01 - 29 は 0 で A1 = 0 もtrueです。
 =(0.29/0.01 - 29) は -3.55e-17 でした。なので
   // ()でくくるとそのまま出るっていうのを初めて知りました。
 そして =+0.7+0.7+0.7...... - 0.7*x (reptで作って貼り付け) した場合
 シート上で0 となるのは -4.49 e-14 まででした。

 誤差と同等の数値も直接入力すると丸められないみたいなので
 intでどこまで丸めるのかわかりませんが、
 一度セルに展開すれば丸目処理とかいらない可能性が高いです。

 めちゃくちゃ勉強になりました。
(ちくわ) 2026/06/05(金) 20:19:19

 A1セル =INT(0.29/0.01)-29  →  0 (なのに)
 A2セル =INT(0.29/0.01-29) → -1 (0になり損なう。やっぱり納得いかないですね)

 これですと、AIさんの「実務上問題になることはほぼない」とは言い難く、
 演算誤差対策を入れて保険を掛けるに越したことはないとの感を強くします。

(半平太) 2026/06/06(土) 18:00:52


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.