【问题标题】:How to do SQL Server rounding digit by digit?SQL Server如何逐位舍入?
【发布时间】:2017-06-27 03:54:12
【问题描述】:

一位顾问描述了我需要在财务应用程序中使用的一种舍入类型。

以下值:0.01488

需要像这样按步骤四舍五入。我们一次将每个数字四舍五入,

0.0148 -> 0.015
0.015 -> 0.02

因此结果是 0.02(2 美分)。

但如果我们正常舍入到 2 dp,值 0.0148 会舍入到 0.01。

这个四舍五入的名称是什么?以及如何使用 SQL Server 做到这一点?

更新:

我上面的例子是一个任意的例子。起始值可能是 0.15436798,即任何小数位数。它与先前乘法的结果有关。在那种情况下,我需要进行更多次舍入。

【问题讨论】:

  • But if we did normal rounding to 2 dp the value 0.0148 would round to 0.01 - 这不是四舍五入,而是截断。
  • 截断?并不真地。如果我这样做,声明@value float = 0.01488 select ROUND(@value, 2) 结果为 0.01。即四舍五入到小数点后两位。

标签: sql sql-server


【解决方案1】:

您可以创建一个标量函数来完成这项工作。 喜欢:

CREATE function [dbo].[fn_roundx]( @num FLOAT,@round INT) 
   RETURNS FLOAT
AS
BEGIN
    DECLARE @count INT=10;

    WHILE @count > = @round
       BEGIN
          SET @num = ROUND(@num,@count);
          SET @count=@count-1;
       END;
    RETURN @num 
END

然后根据您的方便将它用于您想要的任何深度的舍入? 例如

DECLARE @num FLOAT=0.014887;    
SELECT @num AS ActualNumber,dbo.fn_roundx(@num,2) AS RoundedNumber

DECLARE @num FLOAT=0.014887;  
SELECT @num AS ActualNumber,dbo.fn_roundx(@num,3) AS RoundedNumber

听起来不错?

【讨论】:

    【解决方案2】:

    像下面这样的东西怎么样?

    DECLARE @num decimal(20,5)=0.014880;
    DECLARE @count INT=5;
    DECLARE @round INT=2;
    
    SELECT @num value;
    
    WHILE @count > = @round
    BEGIN
       SET @num = ROUND(@num,@count);
       SET @count=@count-1;
    END;
    
    SELECT @num value;
    

    有以下输出..

    你想要的任意数量的round

    【讨论】:

    • 你可以把它放到一个函数中,根据用户要求使用它吗?
    • 有没有一种简单的方法来获取原始值并确定我们应该将计数设置为什么?例如,原始值可能是 0.1543678,所以我们需要将 @count 设置为 7(如果我理解正确的话)。
    • 我的其他答案中编写的功能代码应该可以处理任何小数点,我相信最多 10 位。而且你总是可以添加更多的小数位。并且可以将数据类型从 FLOAT 更改为 DECIMAL 等?
    • 是的.. @count=6 或 7 或任何应该处理这种情况的东西。
    • 但是我可以取一个值 0.12343452435 并计算出我应该进行多少舍入吗?还是您只是认为我应该将其修复为最大值? decimal(20,10) 我应该将@count 设置为 10?
    【解决方案3】:

    两次使用ROUND函数

    第一次传递长度为 3 到舍入 0.014880.01500

    SELECT Round(0.01488, 3) -- 0.01500
    

    最重要的是传递长度为2 以将0.01500 舍入为0.02000

    SELECT Round(0.01500, 2) -- 0.02000
    

    最后应该是这样的

    DECLARE @num NUMERIC(16, 5) = 0.01488
    
    SELECT Round(Round(@num, 3), 2) 
    

    【讨论】:

    • 注意:这仅适用于以小数点后 4 位开头的数字。例如它会中断一个像 0.01448 这样的数字(根据 OP 的步骤,它应该像 0.01448 -> 0.0145 -> 0.015 -> 0.02 这样四舍五入到 0.02)
    • @ZLK - OP 在示例转换中跳过了最后 8 位,所以我假设我们需要从小数点后 3 位开始舍入
    • 当然。但是 OP 询问了四舍五入的名称以及如何在 SQL 中进行,所以我假设该示例只是一个示例,它可能需要四舍五入 (n - 2) 次,其中 n 是理论上可以是任何数字的小数位数。
    • @ZLK - 很公平.. 让我们等待 OP
    • 是的,它可以是任何小数位开头,例如0.154367 或 0.5643453453。它纯粹与之前的乘法结果有关。
    【解决方案4】:

    试试这个,

    select round(round(0.01500,3),2)
    select round(round(0.01488,3),2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-02
      相关资源
      最近更新 更多