从十进制或浮点值派生数字直到2个小数位

时间:2019-08-12 13:07:44

标签: sql-server tsql

存在这样的要求:一列(小数/浮点数)的值范围从整数(例如1)到最多6个小数位(例如1.123456)。我想要获得以下逻辑中解释的值。

 value1     |   value_new
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
13.123456   |   131234.56   --logic: value1: if there are 6 values after decimal, value_new: multiply value1 by 10000
0.12345     |   123.45      --logic: value1: if there are 5 values after decimal, value_new: multiply value1 by 1000
13.1234     |   1312.34     --logic: value1: if there are 4 values after decimal, value_new: multiply value1 by 100 
13.123      |   131.23      --logic: value1: if there are 3 values after decimal, value_new: multiply value1 by 10 
13.12       |   13.12
13.1        |   13.1
13          |   13
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

创建表格:

DECLARE @T AS TABLE
(
    Value1 float
)

INSERT INTO @T (Value1) VALUES
(13.123456),
(0.12345),
(13.1234),
(13.123),
(13.12),
(13.1),
(13);

2 个答案:

答案 0 :(得分:1)

这确实属于表示层,但是,一种选择是通过format()创建字符串。

请注意:format()的性能不是很高。应该谨慎使用。

示例

Select *
      ,NewValue = format(value1,'0.##')
 From  YourTable


value1      NewValue
13.123456   13.12
13.12345    13.12
13.1234     13.12
13.123      13.12
13.12       13.12
13.1        13.1
13          13

答案 1 :(得分:1)

更新

一种到达方法是使用cross apply计算一个比原始浮点值大1000000的int,然后使用%确定原始小数点后的位数数字-一个简单的case表达式:

SELECT  Value1, 
        CASE 
            WHEN Base % 10000 = 0 THEN Value1 
            WHEN Base % 1000 = 0 THEN Value1 * 10
            WHEN Base % 100 = 0 THEN Value1 * 100
            WHEN Base % 10 = 0 THEN Value1 * 1000
            ELSE Value1 * 10000
        END As NewValue
FROM @T
CROSS APPLY (
    SELECT CAST((Value1 * 1000000) AS INT) As Base
) baseValue

结果:

Value1      NewValue
13,123456   131234,56
13,12345    13123,45
13,1234     1312,34
13,123      131,23
13,12       13,12
13,1        13,1
13          13


第一个版本(问题现在有所不同)

尽管我同意这是表示层的责任,
另一种选择是乘以100,强制转换为整数,强制返回浮点数,然后再除以100。

首先,创建并填充示例表(在您将来的问题中为我们保存此步骤):

DECLARE @T AS TABLE
(
    Value1 float
)

INSERT INTO @T (Value1) VALUES
(13.123456),
(13.12345),
(13.1234),
(13.123),
(13.12),
(13.1),
(13);

查询:

SELECT Value1, CAST(CAST(Value1 * 100 AS int) AS float) / 100 As NewValue
FROM @T

结果:

Value1      NewValue
13,123456   13,12
13,12345    13,12
13,1234     13,12
13,123      13,12
13,12       13,12
13,1        13,1
13          13