Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

$DECIMAL (ObjectScript)

InterSystems IRIS の浮動小数点値に変換された数値を返します。

Synopsis

$DECIMAL(num,n)

引数

引数 説明
num 変換される数値。これは通常 IEEE バイナリ浮動小数点数です。
n オプション — 返される有効桁数を指定する整数。$DECIMAL は、値をその有効桁数に丸めて、キャノニック形式の数値文字列を返します。有効な値は、1 から 38、および 0 です。0 値の詳細は以下を参照してください。n が 38 より大きい場合、<ILLEGAL VALUE> エラーが生成されます。

説明

$DECIMAL は、InterSystems IRIS の 10 進数の浮動小数点データ型に変換された数値を返します。この関数は、IEEE 倍精度 (64 ビット) バイナリ浮動小数点形式の数値を InterSystems IRIS の 10 進数の浮動小数点形式の同等の数値に変換するのに使用されます。これは、$DOUBLE 関数で実行される処理の逆です。

IEEE 浮動小数点数は、内部的にはバイナリ・ビットを使用して表されます。ほとんどの 10 進小数は正確に 2 進数で表すことができないため、通常、IEEE バイナリ ($DOUBLE) 形式の小数は、それを $DECIMAL に変換したものとは若干異なります。InterSystems の 10 進数は IEEE 2 進数よりも高精度です。IEEE 2 進数は 10 進数よりも多くの桁数を表すことができます。ほとんどのシステムでは、IEEE 数値を使用して 2 進算術演算を実行できるため、高速な計算ではこの数値形式が推奨されます。これらの数値形式の内部表現と精度の詳細は、"浮動小数点数" を参照してください。

InterSystems IRIS SQL データ型の DOUBLE と DOUBLE PRECISION は、IEEE バイナリ浮動小数点数を表します。NUMERIC データ型は、標準の InterSystems IRIS の 10 進数の浮動小数点数を表します。

num 値は、数字または数値文字列で指定できます。num 値が、InterSystems の 10 進数に変換可能な値の範囲外である場合、$DECIMAL は <MAXNUMBER> エラーを生成します。

$DECIMAL は、キャノニック形式で数値を返します。

  • $DECIMAL(num) は、InterSystems の 10 進数の浮動小数点数を返します。この結果の値は、18 桁の精度または 19 桁の精度です。

  • $DECIMAL(num,n) は、InterSystems の 10 進数の浮動小数点数を表す数値文字列を返します。一般に、数値文字列は対応する数値に変換されます。例外については、"非常に大きな数値文字列" を参照してください。

丸め

n が 1 から 38 (1 と 38 を含む) の $DECIMAL(num,n) を指定すると、有効桁数 n 以下のキャノニック形式の数値文字列が返されます。num が ObjectScript の 10 進数の場合、最大で 19 桁の有効な小数点以下の桁数を返します。num が IEEE バイナリの場合、入力には 1000 桁を超える小数点以下の有効桁数を指定できますが、$DECIMAL(num,n) は 38 桁を超える有効桁数は表示しません。

キャノニック形式の数値文字列では、小数点の前に先行ゼロ、および小数点の後に後置ゼロを付けることはできません。

$DECIMAL(num,n) は 38 桁を超える有効桁数は表示しませんが、$FNUMBER 関数を使用すると、より多くの有効桁数を IEEE バイナリ値で表示できます。長いシーケンスの有効桁数を持つ文字列が与えられた場合、$DOUBLE 関数は最初の 38 桁のみを調べます。

丸めは、以下のように行われます。

  • n が指定されておらず、num の有効桁数が 19 桁より多い場合、$DECIMAL は数値を丸めて、有効桁数 18 桁または 19 桁の InterSystems の 10 進数を返します。$DECIMAL は常に、絶対値が大きい方に丸めます。ただし、ObjectScript の 10 進数に変換される値が 18 桁の精度から 19 桁の精度の間に収まる場合は例外です。この場合、結果は大きい方の 18 桁の値になります。以下に、有効桁数 20 桁の数値を $DECIMAL(num) が有効桁数 19 桁に丸める例を示します。

    USER>w $DOUBLE(12345678901234567890123456789)
    12345678901234568227000000000
    USER>w $DECIMAL($DOUBLE(12345678901234567890123456789))
    12345678901234568230000000000
    
  • n が正の整数の場合、IEEE 標準規格の丸めを使用して丸めが行われます。$DECIMAL は、キャノニック形式の数値文字列で 10 進数を返します。num の有効桁数が 38 桁より多い (加えて n=38) 場合、$DECIMAL は、38 桁目の小数部分を丸め、これ以下の num の桁をすべてゼロで表します。

  • n=0 の場合、$DECIMAL は、以下のようにキャノニック形式の数値文字列で 10 進数を返します。

    • n=0 で、num に対応する 10 進数値が 20 桁以下の場合、$DECIMAL はその値を返します。

    • n=0 で、num に対応する 10 進数値が 20 桁より多い場合、以下のような特殊な丸め (IEEE 丸めではない) が行われます。10 進数文字列値は有効桁数 20 桁に切り捨てられます。20 桁目が "5" でも "0" でもない場合、その切り捨てられた、有効桁数 20 桁の数値が結果になります。20 桁目が "5" または "0" の場合、20 桁目はそれぞれ "6" または "1" に置き換えられ、その 20 桁の数値文字列が結果になります。結果が後から 20 桁未満に丸められる場合、この特殊な丸めによって “double round” エラーを防ぐことができます。これを以下の例で示します。

      USER>WRITE $DECIMAL($DOUBLE(123456789012345678901234567),20)
      123456789012345678150000000
      USER>WRITE $DECIMAL($DOUBLE(123456789012345678901234567),0)
      123456789012345678160000000
      

整数除算

特定の値の場合、InterSystems IRIS の 10 進数の浮動小数点数および IEEE 倍精度数は、異なる整数除算結果を生成します。以下はその例です。

  WRITE !,"Integer divide operations:"
  WRITE !,"IRIS  \: ",$DECIMAL(4.1)\.01  // 410
  WRITE !,"Double \: ",$DOUBLE(4.1)\.01   // 409

IEEE 倍精度数を含む算術演算の詳細は、“サーバ側プログラミングの入門ガイド” の付録 "インターシステムズ・アプリケーションでの数値の計算" を参照してください。

INF と NAN

num が INF の場合は、<MAXNUMBER> エラーが生成されます。num が NAN の場合は、<ILLEGAL VALUE> エラーが生成されます。以下の例に、これらの無効な値を示します。

  SET i=$DOUBLE("INF")
  SET n=$DOUBLE("NAN")
  WRITE $DECIMAL(i),!
  WRITE $DECIMAL(n)

以下の例では、既に InterSystems IRIS 形式になっている小数値に適用されたときに、$DECIMAL が影響を与えないことを説明します。

  SET x=$DECIMAL($ZPI)
  SET y=$ZPI
    IF x=y { WRITE !,"Identical:"
             WRITE !,"IRIS $DECIMAL: ",x
             WRITE !,"Native IRIS:   ",y }
   ELSE { WRITE !,"Different:"
          WRITE !,"IRIS $DECIMAL: ",x
          WRITE !,"Native IRIS:   ",y }

以下の例では、pi の値が $DOUBLE 値と標準の InterSystems IRIS 数値で返されます。この例では、$DOUBLE 数と標準 InterSystems IRIS 数の間では、同等の演算は行われないことを示しています。また、その同等値は、IEEE を 元の InterSystems IRIS に変換するための $DECIMAL を使用してリストアすることはできません。

  SET x=$DECIMAL($ZPI)
  SET y=$DOUBLE($ZPI)
  SET z=$DECIMAL(y)
  IF x=y { WRITE !,"IRIS & IEEE Same" }
  ELSEIF x=z { WRITE !,"IRIS & IEEE-to-IRIS same" }
  ELSE { WRITE !,"All three different"
         WRITE !,"IRIS decimal: ",x
         WRITE !,"IEEE float:    ",y
         WRITE !,"IEEE to IRIS: ",z }

以下の例は、pi の $DECIMAL 変換を $DOUBLE 値で返します。これらの変換は、さまざまな n 引数値によって丸められます。

  SET x=$DOUBLE($ZPI)
  WRITE !,$DECIMAL(x)
   /* returns 3.141592653589793116 (19 digits) */
  WRITE !,$DECIMAL(x,1)
   /* returns 3 */
  WRITE !,$DECIMAL(x,8)
   /* returns 3.1415927 (note rounding) */
  WRITE !,$DECIMAL(x,12)
   /* returns 3.14159265359 (note rounding) */
  WRITE !,$DECIMAL(x,18)
   /* returns 3.14159265358979312 */
  WRITE !,$DECIMAL(x,19)
   /* returns 3.141592653589793116 (19 digits) */
  WRITE !,$DECIMAL(x,20)
   /* returns 3.141592653589793116 (19 digits) */
  WRITE !,$DECIMAL(x,21)
   /* returns 3.141592653589793116 (19 digits) */
  WRITE !,$DECIMAL(x,0)
   /* returns 3.1415926535897931159 (20 digits) */

関連項目

FeedbackOpens in a new tab