SQL Server ROUND() 不适用于以 1 结尾的 FLOAT

ksc*_*ege 5 sql rounding

我改变了我的例子来使用 FLOAT ......太多人被整个 NVARCHAR 事情所困扰。我们没有将数字存储在数据库中作为 NVARCHAR。我只是以 NVARCHAR 为例。我用 FLOAT 得到了相同的结果。

对于某些 FLOAT,我们遇到了 SQL Server ROUND() 问题

    声明@EXCHANGE_RATE FLOAT
    设置@EXCHANGE_RATE = 1.327810000000000000000
    选择回合(@EXCHANGE_RATE,6,1)
    设置@EXCHANGE_RATE = 1.327820000000000000000
    选择回合(@EXCHANGE_RATE,6,1)

第一个返回:1.327809 第二个返回:1.32782

您会认为第一个会返回 1.32781,而不是 1.327809。

这是 ROUND 中的功能还是错误?有什么简单的方法吗?

谢谢!

基于 Mat 将它们转换为 DECIMAL 的想法,这是有效的......它很难看,但有效。我使用 10 的原因是我查看了我们的数据库,这似乎是我们存储的最长的数字。另外我需要将它转换回 FLOAT 因为他们不想看到任何尾随的 0

    声明@EXCHANGE_RATE FLOAT
    设置@EXCHANGE_RATE = 1.327810000000000000000
    SELECT CAST(ROUND(CAST(@EXCHANGE_RATE AS DECIMAL(28,10)),6,1) 作为浮动)

Cha*_*ana 0

我暂时将下面的内容留在这里,这是事实,但这不是操作问题的原因。
正确的答案是 MatBailie 提供的,-nVarChar 字符串被转换为浮点数,然后截断操作将其减少到下一个较低的值......

来自 MSDN 的Round 函数

function
是要执行的操作的类型。函数必须是tinyint、smallint 或int。当 function 被省略或值为 0(默认)时,numeric_expression 会四舍五入。*当指定 0 以外的值时,numeric_expression 会被截断。*

试试这个,它显示了差异:

DECLARE @EXCHANGE_RATE NVARCHAR(200)
SET @EXCHANGE_RATE = '1.3278100'
SELECT ROUND(@EXCHANGE_RATE,6,0) Rounded,
       ROUND(@EXCHANGE_RATE,6,1) Truncated

SET @EXCHANGE_RATE = '1.327810000001'
SELECT ROUND(@EXCHANGE_RATE,6,0) Rounded,
       ROUND(@EXCHANGE_RATE,6,1) Truncated
Run Code Online (Sandbox Code Playgroud)

输出类型由输入决定...在本例中,输入为“1.3278100”,因此该值将转换为数字数据类型,其精度基于字符串中的有效位数(“1.3278100”具有5 位有效数字),因此输出类型被确定为数字(6,5)或类似的东西......这会导致意外的截断。这以前曾咬过我。