No.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さんも、いろいろな式を書いてみて、いろいろ試してみてください。
No.7
- 回答日時:
>terra5: 16の指数形式は、ミニコン関係
ありゃ、すいません。
いい加減なことを言ってしまったようです。
整数でもいいですけど、DecimalもCurrencyも有効桁数だけならDoubleよりLongより上ですよ。
演算速度遅いですけどね。
もちろん、Longで計算して割り算するのとあんまり変わりません。
みなさん本当にありがとうございました。いろいろな方法で試してみましたがDecimalも不具合が出ないっぽいので採用かなと考えています。いろいろして頂いたのに私からなにもあげれませんが気持ちだけ、、(^-^)/■ チョコレートです。
No.6
- 回答日時:
>Windows系(x86系CPU)
>h × 16^n (16進数×16の自然数乗)
言語によるのかも知れませんが、Cを使っている場合は
2の指数形式、IEEEの形式ですね。
16の指数形式は、ミニコン関係で経験があります。
あと、自然数乗となってますが、正確には整数ですね。
負の値もありますから。
精度が必要で言語でそういう型が無い場合は
TAGOSAKU7さんが言うような形で整数として扱います。
また、こういう誤差があるので、
こういう実数を扱うプログラムでは、=で判定せず、
差をとってある値より小さい場合は同じとみなすような
プログラムを書くのがよく使う手です.
みなさん本当にありがとうございました。いろいろな方法で試してみましたがDecimalも不具合が出ないっぽいので採用かなと考えています。いろいろして頂いたのに私からなにもあげれませんが気持ちだけ、、(^-^)/■ チョコレートです。
No.5
- 回答日時:
DecimalはVariant型の内部形式でしか使えませんが、0と0.0000000000000000000000000001~79,228,162,514,264,337,593,543,950,335の10進数を扱えるので、Currencyよりびっくりです。
もちろん、doubleのように指数を使って大きな数値を表すことはできませんが。
No.4
- 回答日時:
ごめんなさい。
きちんと読んでませんでした。8桁なら1億倍ですね。
それ以前に
>CDecすりゃいいよ
? (cdec(0.7015)- cdec(0.7000))
の出力値は確かに0.015でした。大丈夫なのでは?
うーん 奥が深い。Cdec。。。考えもしなかった。。。
みなさん本当にありがとうございました。いろいろな方法で試してみましたがDecimalも不具合が出ないっぽいので採用かなと考えています。いろいろして頂いたのに私からなにもあげれませんが気持ちだけ、、(^-^)/■ チョコレートです。
No.2
- 回答日時:
実数演算の宿命です。
ちなみに
「電卓は、10進扱いで、このような誤差はない」
とのたまう人が居ました。
「VBの甘い罠」/実数における誤差
(↓URL)
参考URL:http://rhodes.fuis.fukui-u.ac.jp/nakata/comp/vb/ …
みなさん本当にありがとうございました。いろいろな方法で試してみましたがDecimalも不具合が出ないっぽいので採用かなと考えています。いろいろして頂いたのに私からなにもあげれませんが気持ちだけ、、(^-^)/■ チョコレートです。
No.1
- 回答日時:
これは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お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++で割り算の結果を昇順に出力するプログラムを作りたいのですが、例えば(double)100000 3 2022/07/15 17:46
- C言語・C++・C# (C言語)めちゃくちゃな値になってしまいます。 5 2022/08/13 11:55
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- 高校 有効数字計算 確定した値を含む 2 2023/01/18 06:03
- 糖尿病・高血圧・成人病 血液検査の実測値と理論値との相違 1 2022/10/06 09:31
- C言語・C++・C# c言語について 下記の計算結果を出力するコードを記述する問題で 0-4 3.14×2 5÷3 30÷ 5 2022/05/17 22:41
- 労働相談 有給休暇使用時の賃金の計算方法について 5 2022/04/04 00:02
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- 数学 時々、回答者の見識に疑念を抱いてしまうんです。私だって本当は皆様のことを疑いたくはありません。しかし 2 2022/11/27 12:23
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
このQ&Aを見た人はこんなQ&Aも見ています
-
「どうして捨てられないの?」前妻の物を捨てられない男性の心理って?
前妻の物を捨てられない理由に加え、捨てるための手段はあるのかを専門家に聞いてみた!
-
VB.net Double と Decimal の違い?
Visual Basic(VBA)
-
VB.NETのテキストボックスの書式指定
Visual Basic(VBA)
-
VB.NET2005 TextBox 高さ(Height) 変更
Visual Basic(VBA)
-
-
4
String"から型'Double'への変換は無効です。 とエラーが出ます。
Visual Basic(VBA)
-
5
VB.NETでコンボボックスの1行目を空白にしたい
Visual Basic(VBA)
-
6
配列を関数に渡す方法
Visual Basic(VBA)
-
7
VBのReturnの使い方
Visual Basic(VBA)
-
8
VB6 String型変数の文字数制限
IT・エンジニアリング
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
O(n log n)について2
-
VB.net Double と...
-
Log関数に関する質問
-
c languageで 簡単な質問があ...
-
10進数での「25」が2進数では「...
-
”/”を使わずに割り算したいんで...
-
0.1の10000回の累積
-
H8/3664FのA/D変換について
-
C言語でセルオートマトンを作成...
-
ftoa関数の作成
-
EXCELの関数"STDEV(標準偏差)"...
-
16進数 加算 減算 C言語
-
色の判定
-
【C++】double の計算結果がお...
-
ExcelでPC(パソコン)によって...
-
符号付整数の演算結果を答えよ ...
-
距離から緯度経度を求める方法
-
浮動小数点演算を固定小数点演...
-
シンプソンの法則について
-
100桁の計算ができなくて困って...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
O(n log n)について2
-
16進数 加算 減算 C言語
-
c languageで 簡単な質問があ...
-
”/”を使わずに割り算したいんで...
-
VB.net Double と...
-
三菱シーケンサ(Aシリーズ)で...
-
ExcelのINT関数の計算結果がお...
-
有効数字について 以前質問をし...
-
ExcelでPC(パソコン)によって...
-
除算を使わずに10で割りたい。
-
EXCELの関数"STDEV(標準偏差)"...
-
floatの有効桁数
-
VBAでミリ秒まで出力する方法
-
2進数の足し算(C言語)
-
100桁の計算ができなくて困って...
-
VB6.0での小数点の扱いについて
-
VBAでの割り算の余りの求め方
-
距離から緯度経度を求める方法
-
BCD・HEX・BINについて
-
コンピューターは指数関数をど...
おすすめ情報