こんにちは!とぉーとゆです。
Googleスプレッドシートを使っていると、小数の比較演算が期待通りに動作しないことがあります。この問題に直面したことがある方は多いのではないでしょうか?
株式投資が趣味の筆者は、買い時の銘柄を探すためにGAS(Google Apps Script)と呼ばれるスクリプト(Excelでいうマクロみたいなもの。厳密には全然違う。)を利用して各種WebページのHTMLから「Webスクレイピング」という技術を使ってスプレッドシートに情報を取り込んでいます。取り込んだ情報を基準値と比較して買いかどうかを判断しているのですが、ここで小数の比較演算で問題が起こりました。
今回は、この問題の具体例と、その解決策について詳しく説明します。この方法を使えば、正確な比較演算ができるようになりますので、ぜひ参考にしてください。
Googleスプレッドシートの小数比較問題とは?
Googleスプレッドシートでは、小数の比較演算がうまくいかないことがあります。例えば上の画像を見てください。C1セルには「=B1 > 50」と入力しているため、B1の値「77.91」と「50」を比較するとB1の値の方が大きい値のため「TRUE」が返ってきます。これは正しい解です。
しかし、4行目をご覧ください。
B4の値は「35.99」なので「50」より大きくありません。なので、期待するべき値は「FALSE」なのですが、C4セルには「TRUE」が返ってきています。
比較対象のセルの表示形式を明示的に数値に指定したり、IF関数を使ってみたり、ROUND関数で極めて小さい小数点以下の値を丸めてみたりしましたが、正しい結果は得られず・・・
ようやく対象法は見つけましたが、現時点で原因については不明のままです。
値を他のセルにコピーすると正しく比較演算できるので、個人的な見解としては、もともとがHTML文書から引き抜いた文字列情報なので表示形式的な不具合、もしくはGASとの相性あたりが原因なのではないかと思います。
ここらへんに知見があって原因に心当たりがある方はコメントいただけますと幸いです。
次の章では見つけた対処法を説明します。
対処法の説明
まず初めに断っておくと、ご紹介する方法はExcelやプログラミングができる方にとっては、とっても気持ちが悪いです。いやもしかしたら誰でも「もやっと」するかもしれません。
その解決方法とは、比較式の中で比較演算の対象となる小数に0.1を足してから0.1を引く(引いてから足しても可)という方法です。この数学上まったく意味のない式を入れるのがとても気持ちが悪いですが、これにより正確な比較を行うことができるようになります。
おそらく、スプレッドシートに対して小数の計算であることを明示する効果があるのかな?と思いますが、なぜこの方法が効果的なのかははっきりとはわかりません。
具体的な手順
では、実際にこの対処法を使ってみましょう。C列の比較式を編集します。
もともとは「=B列>50」という式でしたが、これを「=(B列+0.1ー0.1)>50」と書き換えます。
下の行まで修正した式を反映させれば完了です。
無事、50以下の値がすべて「FALSE」になりました!最初全然気づかなかったですけど50以下の値こんなにあったんですね(笑)
まとめ
今回紹介した方法を使うことで、Googleスプレッドシートでの小数比較問題を解決することができます。要点を再度まとめると以下の通りです。
もやもやが残りますが、この対処法を使えば小数の比較問題に悩まされることなく、スムーズに作業を進めることができるでしょう。さらに良い方法や根本解決のヒントなどありましたら、コメント欄でお知らせください。質問も随時受け付けていますのでお気軽にご連絡ください。
この記事が皆さんの問題解決の一助となれば幸いです。最後まで読んでいただきありがとうございました!
コメント