Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

$DECIMAL

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

Synopsis

$DECIMAL(num,digits)

パラメータ

num 変換される数値。これは通常 IEEE 浮動小数点数です。
digits オプション — 返される有効桁数の数を指定する整数。$DECIMAL は、IEEE 浮動小数点丸めアルゴリズムを使用して、戻り値をその桁数に丸めます。有効値は、1 ~ 38 と 0 です。digits が 桁数よりも大きい場合、値はそのまま返されます。digits が 0 の場合、有効桁数が 20 を超えない限り、num で丸めは行われません (0 値の詳細については以下を参照)。

説明

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

CachéSQL データ型の DOUBLE と DOUBLE PRECISION は、IEEE 浮動小数点数を表します。FLOAT データ型は、標準 Caché の小数点以下の数値を表します。

IEEE 浮動小数点数は、内部的には 53 のバイナリ・ビットを使用して表されます。ほとんどの 10 進小数は正確に 2 進数で表すことができないため、通常、$DOUBLE 形式の小数は、それを $DECIMAL に変換したものとは若干異なります。サポートされるすべての Caché システム・プラットフォームにおいて、標準の Caché 小数は、小数桁数 18.96 桁の近似精度を持ちます。IEEE 浮動小数点数が小数として表示されるとき、バイナリ・ビットが18 桁を大幅に超える小数桁数の小数に変換されることがよくあります。これは、IEEE 浮動小数点数が標準の Caché 小数より精度が高いことを意味するわけではありません

num 値は、数字または数値文字列で指定できます。これは、$DECIMAL 変換の前に、キャノニック形式 (先頭と末尾のゼロが削除され、複数の正符号および負符号が解決されるなど) に解決されます。num の値が、FLOAT データ型に変換可能な値の範囲外である場合、$DECIMAL は <MAXNUMBER> エラーを生成します。数値でない文字列を num に指定すると 0 が返されます。混合数値文字列 ("7dwarves" または "7.5.4" など) を num に指定すると、数値でない文字が初めて現れた箇所で入力値が切り捨てられ、その後、数値部が変換されます。

既定では以下のように丸めが行われます。

  • 小数 : num の有効桁数が 19 桁より多く、digits が指定されていない場合、$DECIMAL は小数部分を 19 桁に丸めます (丸めにより末尾がゼロになる場合は 19 桁未満)。$DECIMAL は、より大きい絶対値を持つ、最も近い小数値に丸めます。

  • 非常に大きな整数 : num の小数点の左側の整数有効桁数が 19 桁より多く、digits が指定されていない場合、$DECIMAL は有効桁数が 19 桁になるように丸めます (残りの整数桁はゼロで表します)。

  • 1 未満の非常に小さな小数 : num が、小数点の右の有効数字の前にゼロが 20 個以上ある小数で、digits が指定されていない場合、$DECIMAL はゼロを維持し、小数の有効部分が 19 桁になるように丸めます。

  • 非常に小さな小数部分を持つ 1 以上の数 : num が、小数点の右の有効数字の前にゼロが 20 個以上あり、整数部分がゼロでない数で、digits が指定されていない場合、$DECIMAL は整数に丸めます。

digits 引数は、戻り値を指定された桁数に丸めるために使用できます。末尾のゼロは、常に削除されます。digits が正の整数の場合、IEEE 標準規格の丸めを使用して丸めが行われます。num の有効桁数が 38 桁より多い (加えて digits=38) 場合、$DECIMAL は、38 桁目の小数部分を丸め、これ以下の num の桁をすべてゼロで表します。digits が 38 より大きい場合、<ILLEGAL VALUE> エラーが生成されます。

digits が 0 の場合、数字は文字列照合にキャストされます。これは、(+num)_"" と同等です。num が 20 桁以下の場合、digits=0 と digits=20 は同じです。

ただし、digits が 0 で num が 20 桁より多い場合、以下のような特殊な丸め(IEEE 丸めではない) が行われます。丸めは、20 桁を返すために行われます。0 または 5 に丸める場合は、特殊な丸めが 20 桁目で実行されます。20 桁目が 0 または 5 に切り上げられる場合は、それぞれ 9 または 4 に切り捨てられます。20 桁目が 0 または 5 に切り捨てられる場合、Caché は 1 または 6 にそれぞれ切り上げます。その他の 20 桁目の値は、そのまま返されます。この丸めアルゴリズムは、正確な数値照合を提供し、矛盾を防止します。

整数除算

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

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

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

INF と NAN

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

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

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

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

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

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

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

  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