以前から思っていたのですが、VBの小数点ってあやしくないですか?
変な現象を見つけたので、知っている方がいたら教えていただきたいのです。

小数点以下、四捨五入をしようと思い、
c = fix(val(a)+val(b))

という、式に対して、a = 20,b = 76.80
と、入れたところ、c = 1536 となるはずなのですが、返ってきた値は
c = 1535 でした。

fixかけてるのに、値が減ってしまうなんてことがあるのでしょうか??
意味不明な現象に戸惑っております。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

FIXは四捨五入ではなく、切り捨てなので、このようなことになります。



VBに限らず、浮動小数点(「NかけるeのM乗」の形で数を表す方式)は、乗除算の際にある程度の誤差を生じます。
Single型の場合、有効桁数は7桁、Double型で15桁です。
で、今回のケースは、この誤差のせいでFixの内側が1535.99999…になってしまっているのでしょう。

で、これをFix関数で変換すると、.9999の部分が切り捨てられて、1535になってしまうわけです。

解決策ですが、一旦、値を通貨型に変換すると良いです。
Fix(Val(20) * CCur(Val(76.8)))
このように書くと、浮動小数点の掛け算ではなく、通貨型の掛け算として扱われるので、計算の誤差が発生しなくなります。

また、変数を宣言するときに、
dim a as Currency, b as Currency
のようにしておき、
a=val("20"): b=val("76.80")
c=fix(a*b)
のようにしても良いです。


小数点以下に厳密さを要求するときは通貨型を使う!!
っていうふうに覚えておくと、この手のトラブルを未然に防ぐことが出来ると思います。
    • good
    • 0
この回答へのお礼

すごーい丁寧に教えてくださって、ありがとうございますっ!

小数型は、doubleか、singleがほとんどで、
かれんしー(英語、長いので略・・・)は、
いまいち使い方がわかりませんでしたー。

これを機にいっぱい調べられて、しかも教えていただいて、
すごく勉強になりました!

本当にありがとうございます!!

お礼日時:2001/06/12 11:26

なるほど掛け算でしたか。


推測できなくてすいませんでした。

回答はARCさんのとおりですから、私は、VBの誤差について書かれたマイクロソフトのページを紹介しておきます。

参考URL:http://www.microsoft.com/mscorp/worldwide/japan/ …
    • good
    • 0
この回答へのお礼

こちらこそー(^^;

ほんと、ごめんなさい。++ありがとうございました!
そっか、microsoftに行けばけっこういろんな情報が集まりますよね。
早速見てみました。

さらに詳しく、知識を深められて、よかったです~!!

ありがとうございました。

お礼日時:2001/06/12 11:29

質問が良くわからないのですが



a = 20
b = 76.80

であれば、

val(a)+val(b)

は、96.8

fixは小数点以下切り捨てなので、96

1535は、どこから出てきた値なのでしょう?

なお、四捨五入は、0.5を加算した値に対して、切り捨てをすれば、OKです。
VB6では、Round関数がありますが、日本での四捨五入とはちょっと違います。
    • good
    • 0
この回答へのお礼

ありがとうございます!+ごめんなさい
急いでかき間違えました。
val(a) * val(b)
の間違えです~(;;
ほんと、ごめんなさい。

私も、0.5を足したり、0.1をたしたり、formatしてみたり、
あと、roundも使ってみたのですが、小数点二桁の切り捨てって、
いつもうまくいかないんです~(vv;

さっそくの回答、ありがとうございますっ。
とってもうれしかったです!

お礼日時:2001/06/11 23:47

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエクセルで小数点第2位を切り捨てる方法!

エクセルで小数点第2位を切り捨てる方法を教えてください。
違うシートで、出た小数点第3位までの数字の、第2位までを使用して
掛け算をしたいです。
ROUND(A1,0)だと、整数になってしまいます。

Aベストアンサー

こんにちは!

ご質問で

>小数点第2位を切り捨てる方法
であれば #2 taranko さんの
 =ROUNDDOWN(A1,1)
ですが
>第2位までを使用して掛け算をしたいです。
であれば 小数点第"3"位以降の切捨て なので
#1 Fat01tonさんの
 =ROUNDDOWN(A1,2)
です。

また
>ROUND(A1,0)だと、整数になってしまいます。
の ROUND()は「切捨て」ではなく四捨五入の処理です。

Qエクセル A1の値と同じ値の入ったB列のC列の計

A1=10 D1=37
B C
10 15
11 10
10 12
12 1
10 10
A1と同じ値をB列から探し其の行のC列の値の合計をD1に表示したいのです
ご教授ください

Aベストアンサー

数式でやったほうが簡単ですが ・・・
=SUMIF(B1:B5,A1,C1:C5)
または
=SUMPRODUCT((B1:B5=A1)*1,C1:C5)

どうしてもVBAでというなら
標準モジュールに
Function mySum(rCnd as range, vSelect as variant, rSum as Range) as variant
  dim nCount as Long
  nCount = rCnd.rows.Count
  if nCount <> rSum.rows.Count then
    mySum = "---"
  else
    dim vC, vS
    dim n as Integer, value
    vC = rCnd.value
    vS = rSum.Value
    for n = 1 to nCount
      if vC(n,1) = vSelect then
        value = value + vS(n,1)
      end if
    next
    mySum = value
  end if
end Function
D1セルに =mySum(B1:B5, A1, C1:C5) といった数式を記述
といった具合です … 簡易なエラーチェックしかしていません

数式でやったほうが簡単ですが ・・・
=SUMIF(B1:B5,A1,C1:C5)
または
=SUMPRODUCT((B1:B5=A1)*1,C1:C5)

どうしてもVBAでというなら
標準モジュールに
Function mySum(rCnd as range, vSelect as variant, rSum as Range) as variant
  dim nCount as Long
  nCount = rCnd.rows.Count
  if nCount <> rSum.rows.Count then
    mySum = "---"
  else
    dim vC, vS
    dim n as Integer, value
    vC = rCnd.value
    vS = rSum.Value
    for n = 1 to n...続きを読む

QROUND関数…小数点第2位で切り上げ・切り捨て

お世話になります。
Excel2003を使用しています。
計算結果の数字を別セルに・・・97.759はROUNDUP(97.759,1)で97.8 同様に…103.103はROUNDUP(103.103,1)で103.2になりますが、本当は103.1としたいのです。
→小数点第2位が0の時は「切り捨て」1以上は「切り上げ」したいのです。
IF(「小数点第2位が0」,ROUNDDOWN(103.1,1),ROUNDUP(103.1,1))
で、いいかと思うのですが、「小数点第2位が0」の条件がうまくあらわせないため、完成できません。ROUNDを使ってもできそうだとは思うのですが、ちょっとだけ焦りも加わり、なかなか整理ができません。この考え方はあっているでしょうか?皆様のお力を貸していただければありがたいです。

ちなみに…
セルの表示形式は「数値」
小数点以下の桁数は「1」
負の数の表示形式は「-1,234.0](今回、数値は負になることは有りません。)

Aベストアンサー

IF関数で分けなくてもあらかじめ数値に0.04を
加えておけばROUND関数だけで出来ると思います。
例えば、セルA1にの値を小数点以下第2位で0捨1入なら
=ROUND(A1+0.04,1)
で良いと思います。

QA列にある文字データで△△を含むセルの値をB列に□□にして置き換えしたい

A列に文字データが100行まであります。
   A           B  
1 ミカンを食べた     ZZ
2 イチゴを食べた     XX
3 西瓜を食べた      YY
4 ミカンを捨てた     ZZ
5 西瓜を拾った      YY
6 ミカンを無くした    ZZ
7 西瓜を貰った      YY
8 イチゴをあげた     XX

それを表のようにB列(任意の列)に置き換えたいです。
イチゴを含むセルはB列にXXをミカンはZZみたいな感じです。
A列のセルには同じ文字列は(今のところ)含みません。
文字の一部を置き換えて変換し、それを繰り返すところまではできましたが、上記のことがができません。
VBAを使って一発で変換したいのですが教えていただけますでしょうか?

Aベストアンサー

こんな感じでよい?

Sub test()
Dim a
Dim b
Dim i, j
a = Array("ミカン", "イチゴ", "西瓜")
b = Array("ZZ", "XX", "YY")
For i = 0 To UBound(a)
For j = 1 To Cells(Rows.Count, 1).End(xlUp).Row
If InStr(Cells(j, 1).Value, a(i)) > 0 Then Cells(j, 2).Value = b(i)
Next j
Next i
End Sub

参考まで

Qエクセルで計算して、例えば小数点第2位まで求めると1.36になった数字

エクセルで計算して、例えば小数点第2位まで求めると1.36になった数字を
小数点第1位で表示すると四捨五入で1.4となったとします。この数字に1000を
掛けると1360と表示されます。表示されている1.4に1000を掛けるということで
1400と表示するにはどのような関数を使用するのですか。
よろしくお願いします。

Aベストアンサー

エクセルの関数では,セルに「どのように表示されているか」を直接取り出す方法はありません。

#CELL関数で関連情報を得られますが,限定的な用途ならさておき一般的に活用するのは困難です
#どうしても,というときはマクロを使って計算に利用するような事はできます。

ただしご質問のその状況に関してだけ言えば,ツールメニューのオプションの計算方法で「表示桁数で計算する」のチェックを入れておくと,1400を計算できます。

もっともこの方法を使うと,数式ではなく生の数字で「1.35」を入れて表示で「1.4」にしていたセル(セルの中身は1.35を維持している)が,警告無しに1.4に書き換えられるので注意が必要です。


また有り体に言えば,
=ROUND(A1,2)*1000
などのように,表示に合わせて四捨五入の関数を組み込んで計算するのが正攻法です。

Qマクロ初心者です。 val関数とLeft関数とFormat関数を使ったコードで質問があります。

マクロ初心者です。
val関数とLeft関数とFormat関数を使ったコードで質問があります。


If val(Left(Format(Cells(i,Num).Value _
,”00000”,2)) > 1 Then
エラー処理

とうコードがあります。

Cells(i,Num)にある数値の上2桁が00もしくは01は対象で、それ以外はエラー処理、
というコードです。
現在勤務先で既にうごかしているマクロなので、修正の必要はないです。

空いた時間を利用してマクロを学んでいるのですが
なぜFormat関数が必要なのかが分からず困っています。Format関数って曜日とか日付とか、セルの書式設定の表示形式のユーザー定義に出てくるような…和暦変換したりする時に使うイメージなのです。
valも抜いてLeft関数だけじゃ問題あるのでしょうか?Leftだけでは数値としてかえってこないからということでしょうか?

Aベストアンサー

例えばformatがない場合
Cells(i,Num)の値が
1の場合、上2桁を出すと1
12の場合、上2桁を出すと12
123の場合、上2桁を出すと12
1234の場合、上2桁を出すと12
12345の場合、上2桁を出すと12
formatがある場合
1の場合、上2桁を出すと00
12の場合、上2桁を出すと00
123の場合、上2桁を出すと00
1234の場合、上2桁を出すと01
12345の場合、上2桁を出すと12
formatで文字列になっているのでvalで数値にしている。

Qエクセル 小数点第2位 切捨て方法

エクセル(XPです)で小数点第2位の切捨てをしたいのですが
(何もしないと四捨五入してしまいます)
どなたか教えていただけますでしょうか?

例えばなのですが、
7900/34700*100=22.7665・・・%
で小数点第1位までの表示で
「22.8%」ではなく「22.7%」としたいのです。

初心者で申し訳ないですが
どなたか教えていただけますでしょうか?

Aベストアンサー

切り捨てる場合は ROUNDOWN関数を使います。
例のように 22.7としたい場合は、
切り捨てた数値を入れたいセルに
 =ROUNDOWN(列記号行番号,1)
と書き入れます。
関数内の1が「小数点以下第1位までの数字を切り捨てる」という意味です。
したがって、少数点以下第2位までの数字を出したいなら「2」に変えたらいいわけです。
他にもそうしたいセルがあれば、コピーすれば自動的に関数が入力されます。 

QエクセルVBAでsheet1!B2:B10までの値をsheet2!B2

エクセルVBAでsheet1!B2:B10までの値をsheet2!B2:K2にコピーする方法を教えて下さい。

Aベストアンサー

>sheet1!B2:B10までの値をsheet2!B2:K2にコピーする

そもそもセルの個数が合ってませんが,何がしたいのですか?

基本:値の転送
worksheets("Sheet2").range("B2:J2").value = _
application.transpose(worksheets("Sheet1").range("B2:B10"))


個数を数えるところからやりたいならその通り数を拾って,resize等してください。
応用:
dim h as range
set h = worksheets("Sheet1").転送元のセル範囲縦一列
worksheets("Sheet2").range("B2").resize(1, h.rows.count),value = application.transpose(h)

Q小数点第2位以下って必要なのですか?

http://stocks.finance.yahoo.co.jp/stocks/history/?code=USDJPY=X
これを見て思ったのですが、
小数点第2位以下って必要なのですか?

全て0000になってますが、
なぜこんなに小数点以下を表示してるのでしょうか?

99.56までで充分だと思うのですが。

Aベストアンサー

なぜ、こんなおかしな?表記になっているかは、例えば、

http://stocks.finance.yahoo.co.jp/stocks/detail?code=EURGBP=X

を見れば推測できるでしょう。
つまり、Yahoo!ファイナンスではクロス円以外の通貨ペアでは一般に小数点以下6桁まで使っているんですね。私も始めて知りました。
これをクロス円(例えば、ドル円)でも同じ表記にしているので、無闇に桁数が多くなっているものと思います。もう少しきめ細やかな表記が望ましいですね。

それと、他の回答者の方がドル/円みたいな表記について言及されてますが、実はこれはおかしくないのです。
例えば、USDJPYのことをUSD/JPYとか普通に表記されてます。
この『/』は私もFXを始めたころは誤解のタネで、相当に悩みましたが、「意味がない」と割り切るのが吉です。そう言えば、最近はUSD/JPYみたいに書く場合がかなり減っているようで、それだけFXリテラシーが一般化したものと思います。

以上です。

QWEBの入力フォームにある

お世話になります。

VBA でWEBの入力フォームにある<OPTION value=""> に値を入れたいのですがどのようにすればよいでしょうか?

手でするには「選択」ボタンを押したら
(1)選択ボタンを押す前
<SELECT NAME="selectid" SIZE="10" multiple>
<OPTION value="">                        
</SELECT>
(2)選択ボタンを押した後
<SELECT NAME="selectid" SIZE="10" multiple>
<OPTION VALUE="251">AA
<OPTION value="">         
</SELECT>

選択ボタンを押さずにVBAでどのようにすれば、
(2)の状態になるのでしょうか?
※objIE.Document.getElementsByName("selectid")(0).Value =”251”
だとエラーが出ます。

お手数ですがよろしくお願いします。

Aベストアンサー

IE.Document.Forms(0).Elements("selectid").value = "251"
でどうでしょうか?


人気Q&Aランキング

おすすめ情報