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 の 言語仕様として定められているためです。

理解しました。言語仕様までたどり着けませんでした。
ありがとうざいました!(^ω^)