11

精度の低下を最小限に抑えるために、浮動小数点計算でいくつかのテストを行いました。ここで示したい現象に出くわし、うまくいけば説明が得られます。

私が書くとき

print 1.0 / (1.0 / 60.0)

結果は

60.0024000960

同じ式を書いて明示的にキャストするとfloat

print cast(1.0 as float) / (cast(1.0 as float) / cast(60.0 as float))

結果は

60

これまでは、小数点以下を含む数値リテラルは自動的floatに適切な精度の値として扱われると考えていました。にキャストするrealと、 にキャストした場合と同じ結果が表示されfloatます。

  • SQL Server が数値リテラルを評価する方法に関するドキュメントはありますか?
  • これらのリテラルのデータ型は何ですか?
  • float精度を上げるために本当にそれらをキャストする必要がありますか (私には皮肉のように聞こえます:)?
  • 式をキャストで乱雑にするよりも簡単な方法はありますか?
4

4 に答える 4

10

SQL Serverは、可能な限り最小のデータ型を使用します。

このスクリプトを実行すると

SELECT SQL_VARIANT_PROPERTY(1.0, 'BaseType')
SELECT SQL_VARIANT_PROPERTY(1.0, 'Precision')
SELECT SQL_VARIANT_PROPERTY(1.0, 'Scale')
SELECT SQL_VARIANT_PROPERTY(1.0, 'TotalBytes')

SQL Serverが暗黙的にNUMERIC(2、1)データ型を使用していることがわかります。
60.0で除算すると、結果がNUMERIC(8、6)に変換されます。
最終的な計算では、結果がNUMERIC(17、10)に変換されます。


編集

SQL ServerBooksOnlineのデータ型変換から取得

Transact-SQLステートメントでは、必要最小限の精度とスケールを使用して、小数点付きの定数が自動的に数値データ値に変換されます。たとえば、定数12.345は、精度5、スケール3の数値に変換されます。

于 2009-07-02T06:58:14.423 に答える
4

はい、頻繁にキャストしてフロートの精度を上げる必要があります。私の見解:

計算前の小数点以下のキャストの精度を高めるには

于 2009-07-02T15:19:31.200 に答える