Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 什么样的SQL Server数据类型可以被准确地划分和重构_Sql Server - Fatal编程技术网

Sql server 什么样的SQL Server数据类型可以被准确地划分和重构

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

考虑下面的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

相反,如果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个数字。