MsSQL地板天花板问题?或者对此有何解释?

MsSQL地板天花板问题?或者对此有何解释?,sql,sql-server,Sql,Sql Server,任何人都可以在MsSQL中尝试: select floor(4.7000000000000000000000000000000000000)+0.5 我得到这个结果:5(!!),但应该是4.5 或使用以下选项重试: select floor(4.70 * 0.25000 * 0.2440 * 5.6325 * 3.0542 * 2.345 * 2.35 * 3.253 )+0.5 结果是89!!但应该是:88.5 这是一个问题吗?或者对此有何解释? (与天花板相同的问题) 谢谢大家! 根据楼

任何人都可以在MsSQL中尝试:

select floor(4.7000000000000000000000000000000000000)+0.5
我得到这个结果:5(!!),但应该是4.5

或使用以下选项重试:

select floor(4.70 * 0.25000 * 0.2440 * 5.6325 * 3.0542 * 2.345 * 2.35 * 3.253 )+0.5
结果是89!!但应该是:88.5

这是一个问题吗?或者对此有何解释? (与
天花板
相同的问题)


谢谢大家!

根据
楼层
的文档:

--SQL Server、Azure SQL数据仓库、并行数据仓库的语法

FLOOR(数字表达式)

返回类型 返回与数值表达式
相同的类型

问题是这不是真的。它保留基本类型,但如果是
十进制
类型,则比例将减小为0:

SELECT
    SQL_VARIANT_PROPERTY(4.00, 'precision') AS [precision]
    SQL_VARIANT_PROPERTY(4.00, 'scale') AS scale,
结果:精密度3,量表2

SELECT 
    SQL_VARIANT_PROPERTY(FLOOR(4.00), 'precision') AS [precision],
    SQL_VARIANT_PROPERTY(FLOOR(4.00), 'scale') AS scale
结果:精密度3,标度0。当您的
十进制数
达到最大精度时,这将成为一个问题:

SELECT
    SQL_VARIANT_PROPERTY(4.7000000000000000000000000000000000000, 'precision') AS [precision]
    SQL_VARIANT_PROPERTY(4.7000000000000000000000000000000000000, 'scale') AS scale,
精密度38,刻度37。但是
FLOOR
将其转换为精度38、刻度0和

SELECT CONVERT(DECIMAL(38, 0), 4) + 0.5
结果为
5
,根据:其结果应为
十进制(40,1)
,但由于其超过最大精度,因此缩小刻度以尽可能保留句点前的位数,再次为我们提供
十进制(38,0)
5

相反,这没有问题:

SELECT 4.0000000000000000000000000000000000000 + 0.5
其结果是一个
十进制数(38,37)
,它可以准确地容纳
4.5000000000000000000000000000000000000000000

寓意是:注意
地板
(和
天花板
)的这一比例消除方面,并根据需要降低精度,以免比例因溢出而降低:

SELECT CONVERT(DECIMAL(3, 0),  FLOOR(4.70 * 0.25000 * 0.2440 * 5.6325 * 3.0542 * 2.345 * 2.35 * 3.253)) + 0.5

根据
楼层
的文档产生
88.5

--SQL Server、Azure SQL数据仓库、并行数据仓库的语法

FLOOR(数字表达式)

返回类型 返回与数值表达式
相同的类型

问题是这不是真的。它保留基本类型,但如果是
十进制
类型,则比例将减小为0:

SELECT
    SQL_VARIANT_PROPERTY(4.00, 'precision') AS [precision]
    SQL_VARIANT_PROPERTY(4.00, 'scale') AS scale,
结果:精密度3,量表2

SELECT 
    SQL_VARIANT_PROPERTY(FLOOR(4.00), 'precision') AS [precision],
    SQL_VARIANT_PROPERTY(FLOOR(4.00), 'scale') AS scale
结果:精密度3,标度0。当您的
十进制数
达到最大精度时,这将成为一个问题:

SELECT
    SQL_VARIANT_PROPERTY(4.7000000000000000000000000000000000000, 'precision') AS [precision]
    SQL_VARIANT_PROPERTY(4.7000000000000000000000000000000000000, 'scale') AS scale,
精密度38,刻度37。但是
FLOOR
将其转换为精度38、刻度0和

SELECT CONVERT(DECIMAL(38, 0), 4) + 0.5
结果为
5
,根据:其结果应为
十进制(40,1)
,但由于其超过最大精度,因此缩小刻度以尽可能保留句点前的位数,再次为我们提供
十进制(38,0)
5

相反,这没有问题:

SELECT 4.0000000000000000000000000000000000000 + 0.5
其结果是一个
十进制数(38,37)
,它可以准确地容纳
4.5000000000000000000000000000000000000000000

寓意是:注意
地板
(和
天花板
)的这一比例消除方面,并根据需要降低精度,以免比例因溢出而降低:

SELECT CONVERT(DECIMAL(3, 0),  FLOOR(4.70 * 0.25000 * 0.2440 * 5.6325 * 3.0542 * 2.345 * 2.35 * 3.253)) + 0.5

产生
88.5

,这很奇怪,如果你只从第一个例子中去掉一个零,那么答案是
4.5
DECIMAL
精度。这方面的规则是。如果你想要一些“简单”的东西,在你的常数中加上“E”。瞧,现在你得到了
FLOAT
calculations.Yep。基本上与执行
select CAST(4为数字(38,0))+0.5
相同,
FLOOR
的文档说明“返回与
numeric\u表达式相同的类型”
”,这是非常误导人的。显然,除非你认为所有的<代码>十进制< /代码> s都是相同的类型,不管其大小或精度如何……是的,这有点令人困惑。如果您创建变量并设置正确的数据类型,并在其中保留4.70…0和0.5,然后将它们相加,您将得到预期的答案4.5。奇怪的是,如果您仅从第一个示例中删除一个零,则anwers的精度为
4.5
。这方面的规则是。如果你想要一些“简单”的东西,在你的常数中加上“E”。瞧,现在你得到了
FLOAT
calculations.Yep。基本上与执行
select CAST(4为数字(38,0))+0.5
相同,
FLOOR
的文档说明“返回与
numeric\u表达式相同的类型”
”,这是非常误导人的。显然,除非你认为所有的<代码>十进制< /代码> s都是相同的类型,不管其大小或精度如何……是的,这有点令人困惑。如果您创建变量并设置正确的数据类型,并在其中保留4.70…0和0.5,然后将它们相加,您将得到预期的答案4.5。