|
■No85805 (ちゃんころ さん) に返信
> Public Const diele As Single = 8.854188E-12!
VB.NET 的には
Public Const diele As Single = 8.854188E-12F
とも書けますね。
既にご存知かもしれませんが、
接尾辞 F または型宣言文字 ! が Single / 単精度浮動小数点型で
接尾辞 R または型宣言文字 # が Double / 倍精度浮動小数点型で
接尾辞 D または型宣言文字 @ が Decimal / 10進型となっています。
型宣言文字は古い VB や BASIC でも使われていた記号ですが、現在でも有効ですね。
C# だと、下記のように微妙に違うので、相互書き換えの際にはご注意を…。
接尾辞 F または f が float / System.Single で
接尾辞 D または d が double / System.Double で
接尾辞 M または m が decimal / System.Decimal です。
■No85804 (ちゃんころ さん) に返信
> Public Const diele As Single = 8.85418782E-12
> と入力すると、自動で
> Public Const diele As Single = 0.00000000000885418782
> と置き換わってしまいます。
これが VBA だとその逆で、
8.85418782E-12
に統一されてしまうみたいですね。
No85811 で示した
>> Double 型リテラルの場合、E+14〜E-16 の範囲は小数表記、その範囲外が指数表記になり、
>> Single 型リテラルの場合、E+6〜E-8 の範囲が小数表記、その範囲外が指数表記になります。
に合わせて言えば、VBA で小数表記になるリテラル範囲は、
Double 型が E+14〜E-16 の範囲で、Single 型が E+06〜E-07 の範囲のようです。
> 指数表記のままで表示したいのですが
> どうすれば良いですか?
Visual Studio のオプション設定で、「コードの再フォーマット」を Off にすれば
一応置き換わらなくはなります。
といっても、[編集]-[詳細]-[ドキュメントのフォーマット] などによって
容易に置き換えられてしまうので、一時凌ぎにしかなりませんが。
コードの表現上、指数表記を好むのであれば、Const の代わりに
ReadOnly なフィールド変数かプロパティで代用するのはどうでしょう。
Public Shared ReadOnly diele As Single = CSng("8.541882E-12")
Const でないと都合が悪いなら、コメントで補足しておくとか…。
Public Const diele As Single = 0.00000000000885418782 ' = 8.85418782E-12
> Public Const diele As Single = 8.85418782 * 10 ^ (-12)
> というようにするしかないですか?
個人的にはあまり好きな表現ではないですが、
本来求める結果と同じ結果となるのであれば、
そのような書き換えをするという手もありだと思いますよ。
ちなみに、
Public Const diele1 As Single = 0.00000000000885418782 '8.85418782E-12
Public Const diele2 As Single = 8.854188E-12F '8.85418782E-12F
Public Const diele3 As Single = 8.85418782 * 10 ^ (-12) '8.85418782 * 10 ^ (-12)
Public Const diele4 As Single = 885418782 * 1.0E-20R '885418782 * 1.0E-20R
Public Const diele5 As Single = 885418782 * 1.0E-20F '885418782 * 1.0E-20F
の場合、個人的には diele2 の記述を推奨しています。
diele1 と diele2 は、単一の値が VB によって自動整形されただけであり、
それによって結果が異なることは無いと言えるからです。
加えて、右辺の数式としては、1、3、4 が Double 型の結果になる式で、
2, 5 が Single となる式です。
そのため、結果が Single になることを重視して、私は diele2 のリテラル表記で
宣言しています。diele3 は、「^ 演算子」によるものなので、
結果が Double になるのが個人的には好みでは無いので。
結果的には同一なのですけれどね。
diele4 は、diele3 の計算を「整数 × 10^n」形式にしたものですが、
今回のケースでは、分かり難くなるだけでメリットが無いですね。
そして diele5 は、diele4 を Single に統一しようとしたものですが、
これは悪手というか、『間違った対処方法』であることに注意が必要です。
何が問題かといえば、diele5 だけ、diele1〜diele4 とは異なる結果になってしまうという点です。
これは、Visual Basic の仕様において、「Integer * Single」の演算が
「CSng(Integer) * Single」相当の処理になってしまうためです。
(正確な表現ではないですが、あくまでイメージとして)
今回は有効数字 9 桁であり、そもそも Single では表せない値ですから、
「885418782.0F」という値は Single 値で表現しきれません。そのため、近似値である
「885418752.0F」という値で計算されてしまい、本来の値から微減してしまうわけです。
|