■No96981 (ゆい さん) に返信 > "8.0355015e-03" の 03 が 05以上になれば変換は出来ないのでしょうか? 変換はできますが、Single 型の精度では物足りないと感じるかもしれません。 Single 型の精度においては、下記すべて同一値に変換されます。 Dim x As Single = CSng("8.0355010e-03") Dim y As Single = CSng("8.0355015e-03") Dim z As Single = CSng("8.0355019e-03") 上記の値は、いずれも下記の 3 の近似値に変換されることになります。 Single 型でとりえる前後の値も合わせて掲載しておきますね。 0 … 0.008035498671233654022216796875 … 約 0.008035499 1 … 0.008035499602556228637695312500 … 約 0.0080355 2 … 0.008035500533878803253173828125 … 約 0.00803550053 3 … 0.008035501465201377868652343750 … 約 0.008035501 4 … 0.008035502396523952484130859375 … 約 0.008035502 5 … 0.008035503327846527099609375000 … 約 0.008035503 6 … 0.008035504259169101715087890625 … 約 0.008035504 そもそも、『実際に必要な有効桁数』はどの程度なのでしょうか? マラソンの距離が 42.195km だからといって、それを「42195000mm」と言い換える事は、 精度的に不自然なわけです。とはいえ、それで構わないというケースにおいては、 CDec("8.0355015e-03") を使うという選択肢もあろうかと思います。 ただし Decimal にすると、扱える最大値と最小値は Single よりも狭くなります。 そのため『有効桁数』だけでなく、『最大値と最小値はどの範囲なのか』も重要になってきます。 > 念のためSingleをDoubleに変えても同じでした。 Integer 型で「5.3」や「6.4」を保持しようとしたら、5 や 6 に丸められる事はわかりますよね。 Integer は、隣り合う数との間隔が常に 1 な型ですので、それより細かい間隔の値を 保持しようとすれば、整数という近似値に丸められることになります。 Single や Double の場合も同様です。連続した値を保持できるわけでは無く、 有効桁数から外れた値が近似値となります。しかも、その間隔は一定ではなく、 「0 に近いほど細かく」「0 から離れるほど大雑把」になる仕様です。 "8.0355015e-03" の場合、e の前の数値が 8 個あるので、この値の有効桁数は 8 桁ですが、 話を簡単にするために、ここでは「有効桁数 3 桁」の指数があったとしましょう。 1.22E3 と 1.23E3 の差は、10 ですが 1.22E7 と 1.23E7 の差は、100000 になります。 1.22E-3 と 1.23E-3 の差は、0.00001 で、 1.22E-5 と 1.23E-5 の差は、0.0000001 です。 いずれの組み合わせも、「有効桁数 3 桁」の範囲で、隣り合う 2 つの数を比べているだけですが、 E の後ろの値が大きくなるほど、隣り合う値との差が大きく「荒く」なっており、 E の後ろの値が小さくなるほど、隣り合う値との差が小さく「細かく」表現できることがわかります。 そのため、演算時に E の後ろの値(指数)が大きく異なる値同士を扱うと、 有効桁数のうち、実際に使える桁数が狭くなってしまうことに注意してください。 これは Decimal であっても同じことです。 Byte 型の有効桁数は 8 bit なので、10進数換算で 2.40824 桁弱までの精度で扱えます。 Integer 型の有効桁数は 31 bit なので、10進数換算で 9.33193 桁弱までの精度で扱えます。 Single 型の有効桁数は 24 bit なので、10進数換算で 7.22472 桁弱までの精度で扱えます。 Double 型の有効桁数は 53 bit なので、10進数換算で 15.95459 桁弱までの精度で扱えます。 Decimal 型の有効桁数は 96 bit なので、10進数換算で 28.89888 桁弱までの精度で扱えます。
- Child Tree -