Sql server 什么样的SQL Server数据类型可以被准确地划分和重构
考虑下面的T-SQL代码。我想给a,b,c分配10个单位,根据a,b,c的当前值按比例分配 对于这个案子,Sql server 什么样的SQL Server数据类型可以被准确地划分和重构,sql-server,Sql Server,考虑下面的T-SQL代码。我想给a,b,c分配10个单位,根据a,b,c的当前值按比例分配 对于这个案子, select @a + @b + @c 经过计算,精确到了预期的10 但是,在我的客户机应用程序中,这些值是从存储过程返回的,如下所示 4.72222222222222, 4.72222222222222, 0.555555555555556 把它们加在一起,得到9.999999996 粗略地说,问题似乎是4.722222值的末尾缺少了2,如果我手动添加它们,结果将如预期的那样=10
select @a + @b + @c
经过计算,精确到了预期的10
但是,在我的客户机应用程序中,这些值是从存储过程返回的,如下所示
4.72222222222222, 4.72222222222222, 0.555555555555556
把它们加在一起,得到9.999999996
粗略地说,问题似乎是4.722222值的末尾缺少了2,如果我手动添加它们,结果将如预期的那样=10
相反,如果0.55556少了一个5,例如0.55555556,则总和结果=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
这与SQL Server无关。这是IEEE浮点数的正常行为。它们是近似值而不是精确值-例如读取
您可以通过对最终结果进行四舍五入来获得预期结果,但是这也不能保证结果正确。如果需要返回原始结果,则需要避免使用浮点数。请使用
十进制
数据类型,而不是浮点
。小数点声明为:
declare @d decimal(p,s)
p
是小数点左侧和右侧可存储的小数位数的精度或总数
s
是小数点右侧可存储的小数位数或小数位数
因此,要存储
4.722222
,您至少需要十进制(15,14)
。15位小数,其中14位在小数点后。我知道,但是根据实验,十进制数据类型会产生更奇怪的结果。也许你可以发布一个版本的t-sql,它可以将自身重新设置为10,那么我会接受。十进制基本上是一个整数,其中逗号设置为一个特定的(十进制)数字,因此它具有完全不同的属性。一个是,它不太适合大多数部门。在您的情况下,一种解决方案可能是按原样存储商和红利,并在进行除法之前对它们求和-这将返回原始结果。谢谢,我将考虑如何执行此操作。我理解,但是根据实验,十进制数据类型会产生更奇怪的结果。也许您可以发布一个t-sql版本,它可以将自身重新配置为10。此外,我正在处理的数据(例如@a、@b、@c的值)的值从0到100000000不等,因此不可能真正知道p,s在所有情况下都适用。例如,十进制(15,14)在这个人为的示例中甚至不起作用,因为小数点左侧至少需要3个数字。