Visual Basic 中学校 掲示板
投稿内容
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
>
投稿一覧
>
(オラクル)DoubleとDecimalを使った計算について結果のデータ型について
タグの編集...
投稿者
VB初心者
 (社会人)   投稿日時
2021/12/28 10:34:42
初めまして、VB初心者と申します。
オラクルの仕様が全然理解できないので
こちらで質問させていただきます。
関数A(第一引数:Decimal,第二引数:Decimal,第三引数:String)
という関数で
関数A(wkNum(Decimal) * IIF(DataTable.Rows(0以外)(指定テーブル.カラム名.値),True値(Decimal),False値(Decimal)),・・・略)
引数の処理をどこも通らずに
DoubleからDecimalへ縮小変換します、という例外エラーが出て落ちます。
このエラーの回避方法は分かったのですが、
なぜDecimal * Doubleの計算結果が Doubleになるのかが分かりません。
試しに Double * Decimal をやってみましたが、こちらはこのままで結果のデータ型はDecimalとなっていました。
オラクルの仕様?SQLだと大丈夫なのに…
ご教授お願い致します。
投稿者
(削除されました)
 ()   投稿日時
2021/12/28 12:51:47
(削除されました)
投稿者
(削除されました)
 ()   投稿日時
2021/12/28 12:54:25
(削除されました)
投稿者
魔界の仮面弁士
 (社会人)   投稿日時
2021/12/28 14:31:22
> オラクルの仕様が全然理解できないので
VB.NET の質問ですよね。Oracle は関係無いと思いますよ…?
Float 型ではなく Double 型という表現を使ったという事は、
VB の質問と思って良いのですよね。
Oracle の BINARY_FLOAT / BINARY_DOUBLE 型 や
VB の Single / Double 型は「浮動小数点数」ですが、
Oracle の NUMBER 型 や VB の Decimal 型は 浮動小数点数 ではありません。
> なぜDecimal * Doubleの計算結果が Doubleになるのかが分かりません。
「Double 型 との掛け算の結果は Double 型となる」ことが、
VB.NET や VBA の 言語仕様として定められているためです。
Double は「無限大」も記録できる型なので、数値の精度を落としたとしても、
より表現可能な範囲が広い型が採用された方が望ましいということなのでしょう。
> 試しに Double * Decimal をやってみましたが、こちらはこのままで結果のデータ型はDecimalとなっていました。
「Decimal 型同士を乗じた演算結果は Decimal 型となる」ことが、言語仕様として定められているためです。
とりあえず * 演算子のヘルプを貼っておきます。
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/operators/multiplication-operator
その他の演算子についても、御自身で確認してみてください。
(蛇足ですが、\ 演算子は VBA と VB.NET とで仕様が異なります)
> オラクルの仕様?SQLだと大丈夫なのに…
ORACLE も、DECIMAL * BINARY_DOUBLE の演算結果は BINARY_DOUBLE になりますね。
WITH CTE AS (
SELECT -- 各データ型の値を用意
CAST(1.0 AS DECIMAL(22,8)) AS DEC
, CAST(1.0 AS BINARY_FLOAT ) AS SNG
, CAST(1.0 AS BINARY_DOUBLE) AS DBL
FROM
DUAL
) SELECT -- DUMP 関数でデータ型とバイナリ表現を確認
DUMP(DEC, 1016) AS DEC_DUMP -- Typ=2 Len=2
, DUMP(SNG, 1016) AS SNG_DUMP -- Typ=100 Len=4
, DUMP(DBL, 1016) AS DBL_DUMP -- Typ=101 Len=8
, DUMP(DEC * SNG, 1016) AS DEC_SNG_DUMP -- Typ=100 Len=4
, DUMP(DEC * DBL, 1016) AS DEC_DBL_DUMP -- Typ=101 Len=8
, DUMP(SNG * DBL, 1016) AS SNG_DBL_DUMP -- Typ=101 Len=8
FROM CTE
投稿者
KOZ
 (社会人)   投稿日時
2021/12/28 15:10:00
ひょっとして OracleDecimal のことですか?
Dim
oraDec
As
Oracle.DataAccess.Types.OracleDecimal = 1
Dim
dbl
As
Double
= 1
Dim
result2
As
Object
= oraDec * dbl
Console.WriteLine(
"{0}"
, result2.
GetType
())
Console.ReadKey()
結果
Oracle.DataAccess.Types.OracleDecimal
投稿者
VB初心者
 (社会人)   投稿日時
2022/1/25 16:42:37
魔界の仮面弁士さん、KOZさん、ご回答ありがとうございました。
返答が遅くなってしまってごめんなさい。m(__)m
>「Double 型 との掛け算の結果は Double 型となる」ことが、
>VB.NET や VBA の 言語仕様として定められているためです。
理解しました。言語仕様までたどり着けませんでした。
ありがとうざいました!(^ω^)