首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL浮点精度限制为6位

SQL浮点精度限制为6位
EN

Stack Overflow用户
提问于 2013-04-08 23:51:26
回答 1查看 2.8K关注 0票数 5

我在excel中有以下一组计算,我希望能够在存储过程中使用它们。

Excel

代码语言:javascript
运行
复制
CellA: 45/448.2 = 0.100401606425703
CellB: 1-CellA = 0.899598393574297
CellC: 1-CellB = 0.100401606425703
CellD: CellC * 448.2 = 45.000000000000000

在SQL中,我执行以下操作:

代码语言:javascript
运行
复制
declare @a decimal(18,15) = 45/448.2  
declare @b decimal(18,15) = 1-@a
declare @c decimal(18,15) = 1-@b
declare @d decimal(18,15) = @c * 448.2

我还尝试在一行中运行计算。

代码语言:javascript
运行
复制
declare @e decimal(18,15) = (1-(1-(45/448.2)))*448.2

当我返回这些值时,SQL给了我以下内容:

代码语言:javascript
运行
复制
@a: 0.100401000000000
@b: 0.899599000000000
@c: 0.100401000000000
@d: 44.999728200000000

@e: 44.999728200000000

我已经尝试过在SQL中调整小数的精度,但我没有做任何事情,它只返回小数的前6位。

Excel在运行公式时会做任何优化吗?

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-09 00:09:55

即使是你的第一行代码也足以说明问题:

代码语言:javascript
运行
复制
declare @a decimal(18,15) = 45/448.2  
print @a

给出

代码语言:javascript
运行
复制
---------------------------------------
0.100401000000000

这是由于数据类型的原因。当你说

代码语言:javascript
运行
复制
448.2

它(根据the documentation)被解释为decimal,和also per the documentation类型的常量,

在Transact-SQL语句中,带有小数点的常量将使用所需的最小精度和小数位数自动转换为数值数据值。例如,常量12.345被转换为精度为5、小数位数为3的数值。

所以448.2就是decimal(4,3)。当与decimal is treated as having precision of 10 and scale 0结合使用时,45就是integer,。当我们分开时,the rules

代码语言:javascript
运行
复制
Operation     Result precision                        Result scale
e1 / e2       p1 - s1 + s2 + max(6, s1 + p2 + 1)      max(6, s1 + p2 + 1)

在这种情况下,它给出了10 - 3 + 0 + max(6, 0 + 3 + 1)的结果精度和max(6, 0 + 3 + 1)的小数位数,这得出了136

6的结果比例就是为什么结果只有六位小数的原因。

修复它的方法是在对操作数进行操作之前将其转换为适当的类型;例如,以下是两种方法:

强制将数字视为浮点数:

代码语言:javascript
运行
复制
declare @a decimal(18,15) = 45/448.2e0  
select @a

---------------------------------------
0.100401606425703

显式提供小数位数:

代码语言:javascript
运行
复制
declare @a decimal(18,15) = 45/cast(448.2 as decimal(18,10))
select @a

---------------------------------------
0.100401606425703
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15883606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档