ずっと疑問でした、教えて下さい。
ついにその疑問を解き明かさなければ
次に行けない事になりました。
型はDoubleで計算をすると
0.7015-0.7=1.50000000000006E-03
という結果になりますが、
最後の6ってなんですか?この結果で比較をすると、
たまにはじかれる処理が出てくるのです。
ホントは0.0015でしょ?
他に良い方法があれば合わせて
どうぞ宜しくお願いします。

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

A 回答 (8件)

またまた、話を付け加えますと、DecimalはVariant型の内部処理形式でしか使えません。



Dim X As Decimal '不可

Dim Y As Variant 'もちろんAs Variantは省略可
Y = CDec(0.10000000000000000000000001)
Debug.Print Y '0.1が出る
Y = CDec(0.1) + CDec(0.00000000000000000000000001)
Debug.Print Y '0.10000000000000000000000001が出る
Y = CDec("0.10000000000000000000000001")
Debug.Print Y '0.10000000000000000000000001が出る

演算はまず、Variant型の内部形式がDecimalであることを認識して、それから適切な演算関数が呼び出されるのと、内部表現が複雑なこともあって、As Currencyで直接宣言した通貨型よりも多少演算速度が遅れます。

また、リテラル値でとして0.10000000000000000000000001と書いた後CDecで変換しても、0.10000000000000000000000001はDouble型ですから、かってに0.1に丸められます。
それもCDecしても0.1のままです。
3つ目の文のように文字列は正確に変換してくれますが、2個目の文のように計算する必要はないものの、文字列という超低速の形式からの変換ですから、速度は最も下です。

割り算をするとDecimal型であっても演算結果がDoubleになってしまったりと障害は多いですが、精度の高さだけがウリです。
演算速度が遅いと言っても、1000回や10000万回の計算では気になるほどではありません。

VB6になって、始めてDecimalを見つけたときは、おもしろくていろいろ遊んでみました。
HUKAHIREさんも、いろいろな式を書いてみて、いろいろ試してみてください。
    • good
    • 0

>terra5: 16の指数形式は、ミニコン関係


ありゃ、すいません。
いい加減なことを言ってしまったようです。
整数でもいいですけど、DecimalもCurrencyも有効桁数だけならDoubleよりLongより上ですよ。
演算速度遅いですけどね。
もちろん、Longで計算して割り算するのとあんまり変わりません。
    • good
    • 0
この回答へのお礼

 みなさん本当にありがとうございました。いろいろな方法で試してみましたがDecimalも不具合が出ないっぽいので採用かなと考えています。いろいろして頂いたのに私からなにもあげれませんが気持ちだけ、、(^-^)/■ チョコレートです。

お礼日時:2002/02/13 11:53

>Windows系(x86系CPU)


>h × 16^n (16進数×16の自然数乗)

言語によるのかも知れませんが、Cを使っている場合は
2の指数形式、IEEEの形式ですね。
16の指数形式は、ミニコン関係で経験があります。

あと、自然数乗となってますが、正確には整数ですね。
負の値もありますから。

精度が必要で言語でそういう型が無い場合は
TAGOSAKU7さんが言うような形で整数として扱います。

また、こういう誤差があるので、
こういう実数を扱うプログラムでは、=で判定せず、
差をとってある値より小さい場合は同じとみなすような
プログラムを書くのがよく使う手です.
    • good
    • 0
この回答へのお礼

 みなさん本当にありがとうございました。いろいろな方法で試してみましたがDecimalも不具合が出ないっぽいので採用かなと考えています。いろいろして頂いたのに私からなにもあげれませんが気持ちだけ、、(^-^)/■ チョコレートです。

お礼日時:2002/02/13 11:54

DecimalはVariant型の内部形式でしか使えませんが、0と0.0000000000000000000000000001~79,228,162,514,264,337,593,543,950,335の10進数を扱えるので、Currencyよりびっくりです。


もちろん、doubleのように指数を使って大きな数値を表すことはできませんが。

この回答への補足

 じゃデシマル?は平気なんですよね?

補足日時:2002/02/12 17:28
    • good
    • 0

ごめんなさい。

きちんと読んでませんでした。
8桁なら1億倍ですね。

それ以前に
>CDecすりゃいいよ
? (cdec(0.7015)- cdec(0.7000))
の出力値は確かに0.015でした。大丈夫なのでは?

うーん 奥が深い。Cdec。。。考えもしなかった。。。

この回答への補足

 大丈夫ですかね?

補足日時:2002/02/12 17:02
    • good
    • 0
この回答へのお礼

 みなさん本当にありがとうございました。いろいろな方法で試してみましたがDecimalも不具合が出ないっぽいので採用かなと考えています。いろいろして頂いたのに私からなにもあげれませんが気持ちだけ、、(^-^)/■ チョコレートです。

お礼日時:2002/02/13 11:54

原因はもう述べられてますね。



>どうしようもないものなのですか、、?
1000倍した値をLong型に収めてから計算。
その値を1000で割ってはだめ?
    • good
    • 0

実数演算の宿命です。



ちなみに
「電卓は、10進扱いで、このような誤差はない」
とのたまう人が居ました。

「VBの甘い罠」/実数における誤差
(↓URL)

参考URL:http://rhodes.fuis.fukui-u.ac.jp/nakata/comp/vb/ …

この回答への補足

 ご回答ありがとうございました。どうしようもないものなのですか、、?

補足日時:2002/02/12 13:59
    • good
    • 0
この回答へのお礼

 みなさん本当にありがとうございました。いろいろな方法で試してみましたがDecimalも不具合が出ないっぽいので採用かなと考えています。いろいろして頂いたのに私からなにもあげれませんが気持ちだけ、、(^-^)/■ チョコレートです。

お礼日時:2002/02/13 11:55

これはdouble型が利用する記録方式として、



Windows系(x86系CPU)
h × 16^n (16進数×16の自然数乗)

Unixでよく使われるCPU
b × 2^n (2進数×2の自然数乗)

という方式を採っているからです。
人間は

d × 10^n (10進数×10の自然数乗)

という見かたをするので、表示するときは16進数や2進数を10進数に変換しなければなりません。
整数を変換するときは、問題ありません。
しかし、少数はほとんどの場合、10進数を16進数に変換したり、16進数を10進数に変換すると、どちらも無限小数となってしまいます。

たとえば、10進数で0.1という簡単な少数は、16進数では無限小数です。

無限小数を利用すれば、変換は互いに可逆です。
しかし、コンピュータには無限の記憶領域はないので、細かい部分は切り捨て(または繰り上げ)なければなりません。
それが今回の誤差です。

double型はおよそ10進数で15桁程度しか有効数字がありません。
0.7015と書いた場合、有効数字は15桁ですから、

0.7015 = 0.701500000000000

となります。
しかし、15桁目以降は不明です。
今回は保証されていない桁まで考えると

0.7015 = 0.701500000000000xx
-) 0.7 = 0.700000000000000yy
------------------------------
0.0015 = 0.00150000000000006

となってしまったのでしょう。
0.7015と0.7の最初の桁から15桁目まででは6という数字は現れませんでしたが、0.0015の最初の桁から15桁目まででは6が存在してしまうのです。
これを "桁落ち" といいます。

ある程度の科学計算では15桁もあれば十分です。
微妙な部分は切り捨てたり四捨五入します。

しかし、金額計算にdoubleを使ってはいけません。
利子などは数値をなん度もかけ算するので、誤差が無視できないところまでふくれあがります。
15桁などあっというまです。

VBでは金額計算に便利なCurrency型が用意されているので、金額計算をしているようならCurrencyを使います。
もちろん、少数5桁以下は切り捨てられます。
その代わり、精度は19桁ほどあります。

この回答への補足

ご回答ありがとうございます。私の周りの人に「CDecすりゃいいよ」って冷たく言われるんですけど、、。それでは解決しない気がするんです、、私だけ、、?少数桁8桁ぐらいまで正確に計算する方法はないのですかね?

補足日時:2002/02/12 13:48
    • good
    • 0

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

Qc型肝炎はHしたらうつるのでしょうか?

今c型肝炎がテレビのニュースとかに出てるのですけど血液感染以外にエイズみたいにHしたら相手にうつるのでしょうか?
まったく知識がないので教えていただけませんか?
 

Aベストアンサー

C型肝炎が性行為で感染する確率は低いとされています。
しかし、血液感染するものですから、コンドームの使用をお勧めします。
性交渉の際、目には見えないような細かな傷が多数できるのです。そういった傷からの血液感染という可能性を否定することができませんから。
以上kawakawaでした

QVBで235-234.3を0.7にする方法

以下のプログラムを実行するとText1の内容は0.6999969となります
0.7となるプログラミング方法があれば教えて下さい

Private Sub Command1_Click()
Dim u1 As Single
Dim u2 As Single
Dim u3 As Single
u1 = 234.3
u2 = 235
u3 = u2 - u1
Text1 = u3
End Sub

以上宜しくお願いします

Aベストアンサー

宣言を「Currency」型に。

QB型肝炎のキャリアです。うつる??

19歳、遺伝性のB型肝炎のキャリアです。Hするときは相手の方にうつりますか??付き合って2ヶ月の彼氏がいて、きっとバレンタインに初Hすると思います。処女なので、出血するかもなんですが、その血で感染。。。なんてことはないですか?コンドームは絶対に使うつもりですが、心配です・・・。

Aベストアンサー

同じくキャリアです
Hしましたが、
ナニも起こりませんでした
相手の体の都合にもよるのでは?
感染の可能性はありますが、抗体を持つことが出来る
体質であれば何も問題は起きないものです
でも一応相手の了解は取ったほうがいいかと・・・

QVB.net Double と Decimal の違い?

VB.NETで開発しています
元々はC言語で開発してましたが、最近VB.NETをしています
で、以前誰かが作ったプログラムをデバッグしているんですが、その中に Double や Decimal が混じっています
どちらも 浮動小数点 と思うんですが 違いがいまいちわかりません
混じらせる利点ってないと思うんですが、どうなんでしょう?
有効桁数が違うとかだけだったら 簡単なんですが・・

Aベストアンサー

Doubleは俗に言う倍精度浮動小数点数と同じです。
精度重視したのか、Longより大きい値を表現できることを意識したのか、10進数型(Decimal)を使った理由(作者の意図)はこちらも良くわかりません。
Decimalを含むデータ型の説明は下記にあります。
データ型をクリックで詳細説明を参照できます。
http://msdn.microsoft.com/ja-jp/library/47zceaw7.aspx
 

QC型肝炎は尿でもうつるの?

身内にC型肝炎の患者がいるのですが、
便座についていたその患者の尿に気づかず
その上に座ってしまいました。血液で感染することは
知っているのですが、尿でも感染するのかと
気になっています。どうか、教えてください。

Aベストアンサー

気になるのなら調べましょうよ
C型は基本的に血液感染です むかーーーしは輸血とかってのが多かったですけどね こっちに関しては今は無いです
今あるのは麻薬とかの針の使いまわしですかね。
性行為感染とか母子感染とかもなくは無いですがほぼないと思ってください。

つまりその尿が血尿とかで今すぐでた物であり あなたの体内に入り直接粘膜に触れなければ感染しません。
便座についていた程度であれば感染確率は0です

QSQL文がDouble型として認識される

SQL文がDouble型として認識される

質問させて頂きます。
ユーザーのポイントを引き算し、SQLにアップデートするプログラムを組んでいます。
実行すると

String "UPDATE 「テーブル名」 SET 「要素名(Integer)」 " から型 'Double' への変換は無効です。

というエラーが出るのですが、SQL文の部分を何故Doubleに変換するのでしょうか?
デバッグにて変数を確認し、String等をいれてみても同じエラーが出る上
SQL文は他の部分で正常に動いているものをコピーしても同じエラーが出ます。

INSERT INTO テーブル名(要素) VALUES(xxx)"であれば
「String "INSERT INTO テーブル名(要素) VALUES」 " から型 'Double' への変換は無効です。」
となります。

SQL文の記述が間違っているとは思えず、VBの記述の問題としてここで質問させて頂きました。
コードは以下の通りで、環境はVB2010 + SQL Server2008です。
回答して頂くために不足している情報がありましたらすぐに追記致します。
至らない文章ではありますが、どうかよろしくお願い致します。

Dim point As Integer
point = point(Integer型) - price(Integer型)

Dim strSQL As String = "UPDATE 「テーブル名」 SET 「要素(Int型)」 = '" + point + "' WHERE UserID = '" + userid(String型) + "'"

cn.ConnectionString = My.Settings.ServerURL
Dim cmd4 As New SqlCommand(strSQL, cn)

cn.Open()
cmd4.ExecuteNonQuery()
cn.Close()

SQL文がDouble型として認識される

質問させて頂きます。
ユーザーのポイントを引き算し、SQLにアップデートするプログラムを組んでいます。
実行すると

String "UPDATE 「テーブル名」 SET 「要素名(Integer)」 " から型 'Double' への変換は無効です。

というエラーが出るのですが、SQL文の部分を何故Doubleに変換するのでしょうか?
デバッグにて変数を確認し、String等をいれてみても同じエラーが出る上
SQL文は他の部分で正常に動いているものをコピーしても同じエラーが出ます。

INSERT INTO テーブル...続きを読む

Aベストアンサー

SQLの問題ではありません。
これと同じです。

Dim s As String = ""
Dim i As Integer = 0

s = "aaa" + i + "bbb" '<--- ここでエラー


これを回避するには、
s = "aaa" + i.ToString + "bbb" 
又は、
s = "aaa" & i & "bbb"
です。

文字列の結合には、+ を使わずに & を使うことをお勧めします。

フィールド 要素はInt型ですので、
'" & point & "' の前後のシングルクォーテーションは不要です。

QB,C型肝炎が歯科治療でうつる可能性は?

 上記の通りです。
ポイントは、歯医者での口腔処置の場合、一人一人使い捨てでない機器があると思うのですが、処置時に出血もありますのでB,C型肝炎の感染の可能性があるのではないかと思うのですがいかがでしょう?

Aベストアンサー

使い捨てでない機材であっても、リンク先のような消毒を行えば
ウイルスは除去されるようです。

しかしながら、消毒をされていない機器であれば、感染の可能性はあるということになります。
消毒していない機器を使っているような歯科があったとしたら、
ウイルスを撒き散らしているようなものです。

歯科の機器や理髪店のかみそりなど消毒が十分であると祈っています。

参考URL:http://www.mhlw.go.jp/bunya/kenkou/kekkaku-kansenshou09/02-10.html

QDouble型への値の設定で「#」を付ける意味は何ですか?

VB2005で開発しています。

分からないので、自分なりにサンプルプログラムを作ってみましたが、
結果が変わりません。
以下のような感じで、試しました。

------------------------------------------
Dim dbl As Double

dbl = 120.1#
MessageBox.Show(dbl.ToString)

dbl = 120.1
MessageBox.Show(dbl.ToString)
------------------------------------------

「#」を使うことに、どのような意味があるのでしょうか?
うまく調べられませんでしたので、教えて頂けませんか?

お願いいたします。

Aベストアンサー

Dim dbl As Double

dbl = 120.1#   【1】
dbl = 120.1#   【2】

dbl = 120     【3】
dbl = 120#    【4】

上の【1】と【2】は同じ結果
上の【3】と【4】は同じ結果

しかし

Dim dbl As Double

dbl = 1234567890 +1234567890     【A】
dbl = 1234567890#+1234567890#    【B】

dbl = 1234567890.1 +1234567890.1    【C】
dbl = 1234567890.1#+1234567890.1#   【D】

上の【A】と【B】は同じ答えにならない
上の【C】と【D】は同じ結果


本来なら、【A】と【B】も#がついているかいないかでですから
同じ結果にならないといけないが、実際はならない。
【A】の演算は integer として計算されますので桁数オーバーで
エラーになります。


故に、数字事態も、内部では、#がついていると
強制的にdouble になり、ついていないと integer もしくは long になる
ときもあります。

数字 1 は内部では 4バイトで、 1#は内部では8バイトメモリを
占有します。


ただし、小数点の場合は、無条件で double になります。

Dim dbl As Double

dbl = 120.1#   【1】
dbl = 120.1#   【2】

dbl = 120     【3】
dbl = 120#    【4】

上の【1】と【2】は同じ結果
上の【3】と【4】は同じ結果

しかし

Dim dbl As Double

dbl = 1234567890 +1234567890     【A】
dbl = 1234567890#+1234567890#    【B】

dbl = 1234567890.1 +1234567890.1    【C】
dbl = 1234567890.1#+1234567890.1#   【D】

上の【A】と【B】は同じ答えにならない
上の【C】と【D】は同じ結...続きを読む

Qキスでうつるものは

ある風俗嬢のブログにこう書かれていました。
¨キス感染¨
A型肝炎、B型肝炎、C型肝炎。
咽頭クラミジア、咽頭淋病。
HIVウィルス感染=エイズ。

キスでうつります。
キスで簡単にうつる。

あ、、歯周病も歯肉炎もね!!

みんなにありえる可能性。
SEXよりも身近な可能性。
キス感染。


とありましたが、この中で本当にキスで感染する可能性のあるもの

そしてそれに感染した場合に完全に直る病気なのか
完治は難しいのかを教えてください。

Aベストアンサー

咽頭クラミジア、咽頭淋病、口腔ヘルペスは移ります
歯周病は歯周病菌を持っていない人(赤ちゃんなどです。風俗に行く方で歯周病菌を持っていない、という方がいるとは思えませんが…)なら移ります

ヘルペスなど痒痛いブツブツができてかなり辛いです
確かに防ぎようがないという点でHIVより身近でキケンといえますね

Qinteger型、long型、double型

vb6.0についてお聞きいたします。
こちらの問題は、visual studio 2005のvbでは生じません。

windows xp上で動かしているのですが、どうやら
何もしていないあるパラメータに32000ぐらいの数字よりも大きな
数字をいれるとエラーになってしまいます。

それも、integer型、long型、double型のすべての型で生じます。
そういうものなのでしょうか?
HPをいろいろ見ましても、long型で20億ぐらいは
表現できるように書いてあるのですが。

Aベストアンサー

手元のExcel VBA(VB.NET系ではなくVB6系)で実験してみました
LongとDouble共に再現しません。
Integerの場合
http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200304_03040036.html

>VB6ではIntegerが16bit、Longが32bitでしたが、
NETではIntegerが32bit、Longが64bitに変更されてますので。

割と有名ではあるんですが、Microsoft公式の文書を探すのが面倒くさいので放置。(2^16)/2 - 1 = 32767(正と負があるから。VB6のIntegerは-32768~32767しか取れない)
==============================
Option Explicit

Sub hoge()

Dim a As Long

a = 33000
MsgBox (a)


End Sub
===========================
Option Explicit
Sub hoge2()

Dim a As Double

a = 33000
MsgBox (a)


End Sub
=====================
Option Explicit
Sub hoge3()

Dim a As Integer

a = 33000
MsgBox (a)


End Sub

手元のExcel VBA(VB.NET系ではなくVB6系)で実験してみました
LongとDouble共に再現しません。
Integerの場合
http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200304_03040036.html

>VB6ではIntegerが16bit、Longが32bitでしたが、
NETではIntegerが32bit、Longが64bitに変更されてますので。

割と有名ではあるんですが、Microsoft公式の文書を探すのが面倒くさいので放置。(2^16)/2 - 1 = 32767(正と負があるから。VB6のIntegerは-32768~32767しか取れない)
==============================
Option Ex...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング