floor()返回不同的结果

时间:2018-03-21 16:28:47

标签: sql-server

在以下代码中,floor()(在iif()的第3个参数中)未按预期返回100;它返回100.00。我只是测试输出和逻辑,因此测试硬编码值。

select iif(floor(100.000) < cast(round(100.000, 2) as decimal(5, 2)), cast(round(100.000, 2) as decimal(5, 2)), floor(100.000))

然而,这确实会按预期返回100。我不确定原因:

select floor(100.000)

此外,回到iif()函数:如果我首先将floor函数内的值转换为float,它确实返回100。我已尝试将其投放到integerdecimalfloor()仍会返回100.00。这真的让我失望了。我的印象是floor只会返回十进制后的任何内容,如果它是money类型。

1 个答案:

答案 0 :(得分:1)

来自docs on IIF

  

从true_value和false_value

中的类型返回具有最高优先级的数据类型

rules on data type precedence

  

当运算符组合了两种不同数据类型的表达式时,数据类型优先级的规则指定优先级较低的数据类型转换为优先级较高的数据类型

由于表达式的true_value部分返回decimal,因此整个表达式将执行相同的操作。

使用更简单的例子:

SELECT IIF(0 > 0,
        CAST(1 AS DECIMAL(5, 2)),
        2)

这会导致2投射到decimal