- ベストアンサー
Excel97で小数点の計算
Excel97です。 数字をリットルとミリリットルのセルに分けたいので、 リットル =INT(数字) ミリリットル=(数字-INT(数字))*1000 と入力しています。 リットルは正しい数字が出るようなのですが、ミリリットルの計算で 一定の数を入力するとおかしな値が出てしまいます。 例)6.93→ リットル=6, ミリリットル=630.000000000001 原因と解決方法をご存知の方どうか教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
初めまして。サンプルマクロを組んでみました。次の要領で操作してみて下さい。 なお、シート1のA列に値を入力した時にB1にリットルの値・C1にミリリットルの値を表示させるように作ってあります。 ・新規シートを立ち上げ、Alt+F11キーを押してVBE画面を立ち上げ、画面左上のVBAProjectと書かれている下のSheet1をダブルクリックし、表示された画面の右側の白い部分に書きのコードをコピー&ペーストする。 Private Sub Worksheet_Change(ByVal Target As Range) Dim myVlu As Variant If Target.Column = 1 Then Application.EnableEvents = False myVlu = Application.WorksheetFunction.RoundDown(Target.Value, 0) Target.Offset(0, 1).Value = myVlu Target.Offset(0, 2).Value = (Val(Target.Value) - Val(Target.Offset(0, 1).Value)) * 1000 Application.EnableEvents = True End If End Sub ・ALT+F11きーを押してエクセルの画面にもどり、A1に適当な値を入力してみる。 貴方様の思い通りの動作を体験できると思います。 もしご不明な点・不具合等がございましたらお気軽にお知らせ下さい。
その他の回答 (4)
- comv
- ベストアンサー率52% (322/612)
こんばんは EXCELの内部では2進方での演算処理で少数点以下の 計算処理は浮動小数点での処理となりますから10進方 での表記時に微細な誤差をともなうことが多々あります。 VBAでの処理ではないので参考程度ですが関数数式なら =INT(MOD(A1,1)*1000) や =MOD(A1*1000,1000) などでしょうか!
お礼
大変お礼が遅れて申し訳有りませんでした。 どうやらcomvさんのおっしゃるとおり浮動小数点を使用することによる誤差のようですね。 皆様どうもありがとうございました。
- vbafriend
- ベストアンサー率47% (17/36)
こんばんは。早速補足いただきまして有難うございます。 私のマクロは、整数部分を表示させるためにRoundDownを使用していますが、この点はIntを使用しても同じだと思います。ただ、小数部分を計算させるために、下のデータから整数部分を引いて小数部分を計算しそれを1000倍するように組んであります。ですから、問題はないと思いますが、私も勉強になりますので、ご迷惑でなければどのような問題が生じるのか教えて下さい。 歩手数をおかけいたしますがよろしくお願いいたします。
- imogasi
- ベストアンサー率27% (4737/17070)
セルA1「6.93」、B1「=INT(A1)」C1に 「=(A1-INT(A1))*1000」を入れるとB1は「6」、C1は「930」となりました。書式は標準です。 ミリリットル=630.000000000001の6はミスタイプしていませんですか。 それにしても最後の桁が1も表示形式の書式を「###.000000000001とするとそのように出ますが。
補足
申し訳ありません、皆様の指摘されるようにインプットミスがありました。 最初の数字が「9.63」です。 リットルは「9」、ミリリットルは「630.000000000001」となりました。 書式は標準にしています。表示されているのは「630」ですが、値のコピーをすると質問の数字になります。 お手数をかけて申し訳ないんですが、再度のご回答をお願いできませんでしょうか。
- ymmasayan
- ベストアンサー率30% (2593/8599)
2つ問題があります。 (1)630.000・・・はインプットミスでしょう。 (2)目的のセルの書式設定で数字の小数点以下を0桁にしてください。 原因はやって見ればわかります。
補足
ありがとうございます。 実はこれと同じようなマクロを組んでいてこの問題にあたってしまったのです。 VALではなくてINTを使っているということと VariantではなくDoubleを使っているという相違点がありますので、 こちらも試してみます。