
No.2ベストアンサー
- 回答日時:
こんにちは、KenKen_SP です。
>VBAでの割り算の余りの求め方
通常は Mod 演算子を使います。ただし、この時に返される剰余が
浮動小数である場合には整数に丸められます。例が悪いかもしれ
ませんが、
Dim a As Currency
a = 19 Mod 6.7
だと 整数 5 に丸められて返されます。実際に計算すると 5.6
ですね。
PC でこのような浮動少数を扱う以上は丸め誤差はつきものですが、
これでは困る場合は、自分で関数を作ってやります。
下記コードを標準モジュールにコピー&ペーストし、結果を比較
してみて下さい。
Sub Sample()
Dim a As Currency
Dim b As Currency
Dim c As Currency
a = 19
b = 6.7
c = a Mod b
MsgBox "MOD演算子による剰余:" & CStr(c)
c = MOD2(a, b)
MsgBox "自作MOD2関数による剰余:" & CStr(c)
End Sub
'// 剰余を求める関数
Function MOD2( _
ByVal Num1 As Currency, _
ByVal Num2 As Currency) As Currency
MOD2 = Num1 - Int(Num1 / Num2) * Num2
End Function
>偶数か奇数かの判定の記述
まずは偶数・奇数の数学的な定義です。
【偶数】2で割り切れる自然数
【奇数】2で割り切れな自然数
つまり判定値が 0 や -1 や 15.6 などの場合は
「どちらでもない」
となります。この点はどのようにお考えですか?
これにより記述方法が変わります。
No.5
- 回答日時:
KenKen_SPさん、こんにちは。
私が考えたのは、Mod の戻り値のデータ型のことです。元々、Double型を含む、それ以上の高精度のデータ型の戻り値の変数に使っても、低精度にキャストしてしまう演算子では、そのようにしても無駄になってしまうと考えました。
VBAのMod演算子は、戻り値のデータ型が整数の低精度にキャストされてしまうのですから、求める解の精度で、Double型以上の高い精度を求めるなら、Mod は当然使えないわけですね。
確かに、データの「丸め」は発生していますが、それは誤差ではなくて、むしろデータ型自体がキャストされているのだと考えて良いかと思います。それは、単なる結果論なのかもしれませんが、どのようにしても、ModではLong型以上の精度を上げることが出来ません。私の#3のコードは、Mod を使って、その戻り値が、Long型であろうが、Double型であろうが、それは、Long型以内に統一させられるということを示したに過ぎません。
戻り値の型をCurrency 型を使っても、Long型を使っても、Mod演算子を使った場合、異なる結果は発生しないだろうと思います。
No.4
- 回答日時:
んーー書き方が悪かったみたいですね、、
Mod 演算子の内部計算で丸め誤差が発生する、、というところを問題
にしているわけではありません。
PC で少数を扱う場合は結果において「丸め誤差」が発生する可能性は
つきものです。それは内部演算の過程で発生もする場合もあるし、それ
が仕様であったりします。
ここで Mod 演算子は「仕様」で戻り値が丸められて返されます。
剰余を求めるのに Mod 演算子を使ってはいけない、Mod 演算子は間違っ
た値を返すから、、と別に言っているわけではないですよ。
Dim a As Currency
a = 19 Mod 6.7
で5が帰るのは仕様どおりで、エラーではありませんし、この結果の
方が多くの場合は使われるでしょう。
ただ、ユーザーが剰余を少数まで期待する場合、丸められた5という
戻り値はユーザーにとってはやっぱり「丸め誤差」があるのです。
その場合は自前で計算しましょう、、というのが意図するところです。
あと、コードを拝見しましたが変数の型は Currency 型の方がいいと
思います。
んーー。。すみません。Wendy02 さんの言わんとしているところを理解
できません。
No.3
- 回答日時:
こんにちは。
Wendy02です。
ご質問者さんのスレッドに、割り込ませていただきます。直接、ご質問から離れてしまいますので、申し訳ありません。
KenKen_SP さん へ
>Dim a As Currency
>a = 19 Mod 6.7
>整数 5 に丸められて返されます。実際に計算すると 5.6
私は、以前、時間計算の時に、他の方からご指摘いただいたのですが、Mod の戻り値は、整数型で、ワークシート関数のMod のように、Double型ではありません。
これは、浮動小数点数の丸め誤差ではなくて、Mod 演算子の戻り値が、単に下位の整数のデータ型、言い方を換えれば、Double型以上では表現できないからだと思います。
言い方を換えると、そこに浮動小数点丸め誤差が発生しているかは、整数型では分らないのです。浮動小数点丸め誤差は、その演算の過程で起こるものであって、その結果に発生するわけではないからなのです。
Sub FloatingDecimalDifference()
Dim Dividend As Double
Dim Divisor As Double
Dim dblResult1 As Double
Dim dblResult2 As Double
Dim lngResult3 As Long
Dim Result1
Dim Result2
Dividend = 1.13 * 100 '被除数 または、1.13
Divisor = 0.52 * 100 '除数 または、0.52
'この演算過程で、浮動小数点誤差が発生しています。
dblResult1 = Dividend - Int(Dividend / Divisor) * Divisor
'修正しました。
dblResult2 = CDec(Dividend) - CDec(Int(Dividend / Divisor) * Divisor)
'Long型では、丸められています。
lngResult3 = Dividend - Int(Dividend / Divisor) * Divisor
'しかし、ここでは、dblResult2 とlngResult3の結果の区別はありません。
Result1 = Dividend \ Divisor
Result2 = Dividend Mod Divisor
Stop
End Sub
ここでは、dblResult2 とlngResult3の区別はありません。また、lngResult3 とResult2 の区別も付きません。
つまり、Result2 が、Variant 型で、 Mod の引数が、Double 型でも、Result2 は、Long型にキャストされているからです。
ワークシートでは、
A1:
=MOD(1.13,0.52)
は、
0.09 と出ますが、
= A1=0.09
とすれば、False になります。
これは、ワークシートは、Double型しかありませんし、Mod自体も、そのままの桁を戻り値としますから、その内部で、浮動小数点丸め誤差が出ていることが分りますが、VBAは、整数型に丸められているので、それは Double型を含む、それ以上には、それらの演算子の戻り値が返されませんから、誤差が発生しているのか分らないと思うのです。
また、もしも、奇数・偶数かを判定するのでしたら、ワークシートのISEVEN などの関数に準拠させるのが最も楽な方法だとも思えます。
# 数値 評価する数値を指定します。数値 に整数以外の値を指定すると、小数点以下が切り捨てられます
以下は、Excelならではですが、現実には、VBAでは使われないとは思いますが、ワークシートの少数点固定法で以下のような方法もあってもよいかもしれません。
c.f.
a = 1.13
b = 0.52
c3 = CDbl(Evaluate("Fixed(Mod(" & a & ", " & b & "),2)"))
最後の丸めの少数桁は、仮に 15 でも同じです。
なお、VBAでは、このようなことはしませんが、参照設定すれば以下のように出来ないこともありません。(設定: atpusrc1.xls =分析ツール)
iseven(10.56)
たぶん、仕様の参考にはなるような気がします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript 助けてください‼︎ javascriptで質問があります。 配列を定義して、 29342、45342 3 2022/06/26 22:06
- 数学 整数問題についてですが、 「正の整数aに対してa²を4で割ったときの余りを求めよ」という問題で、答え 12 2023/08/28 15:03
- その他(教育・科学・学問) 小学生の算数の商について 3 2023/03/06 14:11
- Visual Basic(VBA) Excel VBA 最終行を取得しVlookup関数をコピーする方法をコーディングで教えてください。 3 2023/05/11 13:14
- 数学 数1 三角形ABCにおいて、a=2√3、b=2√2、A=60°の時 c、B、Cを求めよ。という問題で 4 2022/11/23 21:48
- Excel(エクセル) シートが違う2枚のエクセルシートにある数値を別シートにコピーしたい(VBA?) 8 2022/03/31 12:24
- 数学 中2 数学 8 2023/06/27 21:56
- 大学受験 合同式 2 2022/08/19 13:12
- 数学 数II 剰余の定理と因数定理 整式P(x)をxで割った余りが-4,x-2で割った余りが7である。 P 2 2022/07/03 13:38
- 数学 全ての整数nの平方数を3で割ったときの余りは0か1であることを示せ。 解説は「nを3で割った余りで分 3 2023/03/05 16:12
このQ&Aを見た人はこんなQ&Aも見ています
-
見学に行くとしたら【天国】と【地獄】どっち?
みなさんは、一度だけ見学に行けるとしたら【天国】と【地獄】どちらに行きたいですか? 理由も聞きたいです。
-
いちばん失敗した人決定戦
あなたの「告白」での大失敗を教えてください。
-
みんなの【マイ・ベスト積読2024】を教えてください。
積読、ついついしちゃいませんか?そこでみなさんの 「2024年に買ったベスト積読」を聞きたいです。
-
あなたなりのストレス発散方法を教えてください!
自分なりのストレス発散方法はありますか?
-
思い出すきっかけは 音楽?におい?景色?
記憶をふと思い出すきっかけは 音楽、におい、景色 どれですか?
-
Accessで割り算の余りを求める計算方法を教えてください
Excel(エクセル)
-
VBAに詳しい方、「Mod」を解説していただけませんか?
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.net Double と...
-
有効数字について 以前質問をし...
-
浮動小数演算は実行環境の変化...
-
ExcelのINT関数の計算結果がお...
-
fortranでx=1としても0.9..が入る
-
EXCELの関数"STDEV(標準偏差)"...
-
2進数データのビット演算
-
16進数 加算 減算 C言語
-
VBAでミリ秒まで出力する方法
-
ExcelでPC(パソコン)によって...
-
10次の多項式を求めるプログラ...
-
除算を使わずに10で割りたい。
-
データ型 double の桁数について
-
Log関数に関する質問
-
計算の丸め誤差の解消について
-
浮動小数演算での誤差の蓄積が...
-
-2.18+2.11=-7.00000000000003E...
-
floatの有効桁数がわからない
-
加算と減算で乗算と除算を表現...
-
2進数の足し算(C言語)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
O(n log n)について2
-
有効数字について 以前質問をし...
-
ExcelでPC(パソコン)によって...
-
VB.net Double と...
-
VBAでミリ秒まで出力する方法
-
c languageで 簡単な質問があ...
-
ExcelのINT関数の計算結果がお...
-
EXCELの関数"STDEV(標準偏差)"...
-
16進数 加算 減算 C言語
-
三菱シーケンサ(Aシリーズ)で...
-
除算を使わずに10で割りたい。
-
”/”を使わずに割り算したいんで...
-
CRCの計算方法について
-
VB6.0での小数点の扱いについて
-
UTF8からUnicode(コードポイン...
-
2進数の足し算(C言語)
-
色の判定
-
MATLABでの行列の全要素の和
-
計算の丸め誤差の解消について
-
BCD・HEX・BINについて
おすすめ情報