如何在SQL中舍入4位小数

时间:2014-11-12 19:27:52

标签: casting rounding numeric varchar

我正在使用MS SQL服务器。我有varchar列,我需要转换为NUMERIC(19,4)。我试图对场进行投射和舍入,但在某些情况下,它似乎截断到4位小数,而不是正确的舍入。例如:17.654593需要是17.6546,而不是仅仅放弃] 93'从最后。我使用下面的内容来更新整个字段。有没有办法添加一轮'到这个脚本,所以它正确更新?



update table_name
SET price = case when isnull(price,'') <> ''
	    then CAST(CAST(price as FLOAT) as NUMERIC(19,4))
	    else 0
	    end
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:1)

问题

  1. 我建议不要投射到FLOAT。它本质上是不精确的数据类型,可能是舍入问题的原因。你应该能够直接投射到NUMERIC(19,4)。
  2. 由于这是一个VARCHAR列,因此行可能存在一个值,该值会导致语句失败。尝试在该字段中放置一些文本,然后运行修复程序 - 除非您在其他地方处理错误,否则它将失败。
  3. 如果将此值推回到同一个VARCHAR列中,它将被隐式转换回VARCHAR。它将四舍五入到小数点后四位,但它仍然是VARCHAR。我会假设您真的想要做,但要考虑它是否是正确的解决方案。
  4. 另外,你有没有理由将0替换为NULL?请注意,因为数字零和NULL具有非常不同的含义,如果您不小心,这可能会让您或其他需要在以后消费数据的人绊倒。

  5. 解决方案

    SQL Server 2012或更高版本,解决了舍入问题,将不安全的强制转换解析为NUMERIC,并将NULL值保留为NULL:

    update table_name
    set price = ISNULL(TRY_CAST(price as NUMERIC(19,4)), price);
    

    SQL Server 2012或更高版本,解决了舍入问题,将不安全的强制转换解析为NUMERIC,将NULL值设置为0:

    update table_name
    set price = ISNULL(ISNULL(TRY_CAST(price as NUMERIC(19,4)), price), 0);
    

    SQL Server 2008或更高版本,解决了舍入问题,将不安全的强制转换解析为NUMERIC,将NULL值设置为0:

    update table_name
    set price = case
                  when price is NULL
                    then '0'
                  when ISNUMERIC(price + 'e0') = 1
                    then CAST(CAST(price as NUMERIC(19,4)) as VARCHAR)
                  else price
                end
    

    如果要阻止NULL转换为0,只需删除第一个when子句。