1

以下の T-SQL コードを検討してください。a、b、c の現在の値に基づいて比例配分される 10 単位を a、b、c に割り当てたいと考えています。

この場合、

select @a + @b + @c

計算後は、期待どおり正確に 10 です。

ただし、私のクライアント アプリケーションでは、値はストアド プロシージャから次のように返されます。

4.72222222222222, 4.72222222222222, 0.555555555555556

合計すると、9.999999999999996 になります。

大雑把に言えば、問題は 4.72222222222222 の両方の値の末尾に 2 が欠落しているように思われ、それらを手動で追加すると、期待どおりに結果 = 10 になります。

逆に、0.555555555555556 の 5 が 1 少ない場合 (0.55555555555556 など)、合計結果 = 10 になります。

これをエレガントに処理する方法を提案できる人はいますか? 各結果の精度はそれほど重要ではありませんが、常に元の値に戻すことが重要です@adjustby

declare @totalOwned float
declare @adjustby float
declare @a float
declare @b float
declare @c float

set @adjustby = 10
set @a = 85
set @b = 85
set @c = 10

set @totalOwned = @a + @b + @c 

select @a = @adjustby * (@a/@totalOwned)
select @b = @adjustby * (@b/@totalOwned)
select @c = @adjustby * (@c/@totalOwned)

select @a + @b + @c,@a,@b,@c
4

2 に答える 2

0

これは SQL Server とは関係ありません。これは、IEEE 浮動小数点数の通常の動作です。これらは概算値であり、正確な値ではありません。たとえば、float-point-guide を参照してください。

最終結果を丸めることで期待される結果が得られる場合がありますが、これも正しい結果を保証するものではありません。元の結果に戻す必要がある場合は、浮動小数点数を避ける必要があります。

于 2012-08-21T06:08:13.253 に答える
0

の代わりに、データ型floatを使用します。decimal10 進数が宣言されます。

declare @d decimal(p,s)

p精度、または小数点の左右両方に格納できる 10 進数の合計桁数です。

sスケール、または小数点の右側に格納できる 10 進数の桁数です。

したがって、保存4.72222222222222するには、少なくとも が必要decimal(15,14)です。小数点以下 15 桁、そのうち 14 桁は小数点以下です。

于 2012-08-21T06:11:26.993 に答える