1

考虑下面的 T-SQL 代码。我想将 10 个单位分配给 a、b、c,并根据 a、b、c 的当前值按比例分配。

对于这种情况,

select @a + @b + @c

计算后正如预期的那样正好是 10。

但是,在我的客户端应用程序中,这些值是从存储过程返回的

4.72222222222222, 4.72222222222222, 0.555555555555556

加起来就是 9.999999999999996

粗略地说,问题似乎是 4.72222222222222 值的末尾都缺少 2,如果我手动添加它们,结果 = 10 符合预期。

相反,如果 0.555555555555556 减去 5,例如 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

Instead of float, use the decimal data type. A decimal is declared:

declare @d decimal(p,s)

p is the precision, or total number of decimal digits that can be stored, both to the left and to the right of the decimal point.

s is the scale, or number of decimal digits that can be stored to the right of the decimal point.

So to store 4.72222222222222, you'd need at minimum decimal(15,14). 15 decimals, of which 14 are behind the decimal point.

于 2012-08-21T06:11:26.993 回答
0

这与 SQL Server 无关。这是 IEEE 浮点数的正常行为。它们是近似值而不是精确值——例如阅读floating-point-guide

您可以通过对最终结果进行四舍五入来获得预期的结果,但这也不能保证正确的结果。如果您需要返回原始结果,则需要避免使用浮点数。

于 2012-08-21T06:08:13.253 回答