2022-02-04 EXCEL 浮動小数点とINT関数

4
テディちゃん🐻 @Teddy_ChangG

Excelの関数で悩み中… 途中の事情は省略するけど、以下のような計算結果の違いが発生… =0.35*20は7だけど、 =INT((7.35-7)*20)が6になる なんで…🥲

2022-02-04 12:58:11
テディちゃん🐻 @Teddy_ChangG

とあるデータの処理で、 =INT((A1-B1)*20)のような計算をしたくて、たまたま気付いた現象です…('A`) Excelの計算結果が信用できないから電卓を叩かないといけなくなるw

2022-02-04 13:31:56
光希桃 @mikimomo_as

@Tsutsui0524 @Teddy_ChangG 浮動小数点問題ですね…… 見た目7ですが内部的には6.9999...になっていると思われます =INT((7.35-7)*20) を =INT(ROUND(7.35-7,10)*20) :小数点計算後適当な桁数で四捨五入する =INT((735-700)*20/100) :INT前までの計算を整数で行う などで解消できると思います。 #Excel

2022-02-04 15:56:19
ほえほえ@スプシマン @hoehoe1234

@Teddy_ChangG 理由などはここにありますが、エクセルでの対応はむずかしいですよね。VBAであれば通貨型をつかえば小数点以下4桁の固定小数点として計算できるので計算結果を7にすることができます。 eip.econ.kanagawa-u.ac.jp/eip/excel-calc…

2022-02-04 16:23:16
ほえほえ@スプシマン @hoehoe1234

@Teddy_ChangG このVBAのCcur関数と同様の数値の型変換関数がエクセルにあればよいのですが、書式設定では型変換が聞かなくて、どうしてもというのであれば、たとえば全ての数値を1万倍して結果を1万で割ればVBAのCCurを使ったときと同じように7を得ることができます。 pic.twitter.com/t8FaUl9XKE

2022-02-04 16:25:03
拡大
ほえほえ@スプシマン @hoehoe1234

@Teddy_ChangG この数式の結果は7になります。 =INT(((7.35*10000)-7*10000)*20)/10000

2022-02-04 16:25:44
ほえほえ@スプシマン @hoehoe1234

@Teddy_ChangG エクセルに数値を固定小数点に変換する関数があればよいのです内容に思います。このツイッターのTLを見ている上級者からなにかよいアドバイスがあるといいですね。どうしてもとういのであればユーザ定義関数を作ってVBA側で計算すれば通貨型を使うことができると思います。

2022-02-04 16:27:29
ほえほえ@スプシマン @hoehoe1234

この一連のツイの、エクセルで通貨型(固定小数点)として下4桁までは誤差なくエクセル上で計算する方法ってなにかないのかな?数値に型文字をつけれないし、どうしてるのかな?絶対定番があるはずだよね。 twitter.com/hoehoe1234/sta…

2022-02-04 16:38:07
テディちゃん🐻 @Teddy_ChangG

@mikimomo_as @Tsutsui0524 6.999...になっていました😇 INT前までの計算を整数で処理できるように改造します!ありがとうございます!

2022-02-04 16:39:44
ほえほえ@スプシマン @hoehoe1234

@Teddy_ChangG @mikimomo_as @Tsutsui0524 もう答えはでているようですが、リテラルとしての数字が9.99であれば100を、9.999であれば1000をかければよくて、必要な小数点が整数になる最小の数字(10とか100とか1000とか10000)を全ての数字に掛けるのが間違いが少なくなるような気がします。

2022-02-04 16:44:36
テディちゃん🐻 @Teddy_ChangG

@hoehoe1234 解説ありがとうございます! 「Excelは計算ミスしない」という先入観でパニクっていました😇 とりあえず今回は一万倍して一万で割る方法で乗り切ってみようと思います!

2022-02-04 16:45:27
ほえほえ@スプシマン @hoehoe1234

@Teddy_ChangG 他ツイでもありましたが、実際に必要なのは、小数点あり⇒整数なので、もっとも多い小数点以下を整数にする数字をかければよいです。1万倍だとちょうどVBAの通貨型(Currency)と同じ仕様となるので、常に1万倍もよい考えだと思います。

2022-02-04 16:47:48
まうにゃん @ExcelNyann

@hoehoe1234 @Teddy_ChangG 別の方法としては小数点の計算を一度にやらないという事ですかね。 7.35-7 この時点で有効桁数で一度丸めちゃうのも良いかなと。 ROUND(7.35-7,3) ※3の桁数は時々で

2022-02-04 17:16:44
Excel VBA Diary (OneDrive問題に挑戦中) @excelvba_diary

@hoehoe1234 目的にもよると思いますが... =ROUND(0.35*20,4) =ROUND((1.35-1)*20,4) =ROUND((7.35-7)*20,4) 浮動小数点演算は精度を意識するということなんですが、少なくとも浮動小数点演算にINT関数は危険、とだけ覚えていただければよいかと。

2022-02-04 17:52:17
ほえほえ@スプシマン @hoehoe1234

記事を作成しました。 ここにある以外にもよい方法があれば是非リプ/RTをぶら下げてください。 togetter.com/li/1840557

2022-02-04 18:27:25
高柳⚡exce.live(エクセリブ)チョットデキル @excelive

外部(インターネット)から、デスクトップ版Excelをリアルタイムに更新する独自新技術「https://t.co/cL5LLjL4atクラウド」の開発責任者・営業責任者・雑用係。あと、経理と事務もやってます。https://t.co/cL5LLjL4atとVBAの⚡Worksheet_Changeイベントで世界を変える

https://t.co/XvPq3INyr9

はけた@できるExcel2021 @excelspeedup

公認会計士のはけたです。「できるExcel2021」「会計ソフトのすき間を埋める経理のExcel仕事術」「いちばんやさしいExcelピボットテーブルの教本」「関数は"使える順"に極めよう! Excel 最高の学び方」などエクセル関連書籍を出版。エクセルセミナー、エクセルVBA・GASツール開発。

excelspeedup.com

はけた@できるExcel2021 @excelspeedup

@ExcelNyann @hoehoe1234 @Teddy_ChangG 本気で演算誤差対策をするなら、ここを見てみるといいと思いますよ。 web.archive.org/web/2016041300… ※元記事は消えているのでアーカイブです

2022-02-04 18:29:44
はけた@できるExcel2021 @excelspeedup

@ExcelNyann @hoehoe1234 @Teddy_ChangG 結論としては、@ExcelNyannさんのおっしゃるとおりで、今回の場合だと、どこか(十分に)小さい桁で一回ROUNDをかける、が良いと思います。

2022-02-04 18:30:45
はけた@できるExcel2021 @excelspeedup

下記のように、INT関数を適用する直前に、ある程度の桁数でROUND関数で端数処理をしておくと、計算結果を補正できます。 上段:単にINT 下段:いったん適当な桁数でROUND後、INT twitter.com/Teddy_ChangG/s… pic.twitter.com/T16gPCbtA6

2022-02-04 18:43:33
拡大
光希桃 @mikimomo_as

@hoehoe1234 直接は関係ないですが先日の研究成果はこちらに twitter.com/mikimomo_as/st…

2022-02-04 19:12:55
光希桃 @mikimomo_as

@mechkawa ROUNDUPすると一致しなくなる数値を2つほど2進数化させてみて確認しましたが、52,53ビットあたりで不一致したのでこの辺が原因かもしれません 小数誤差は難しいですよね……。 #Excel pic.twitter.com/2rIgRufUt5

2022-01-30 21:08:51