如何从整数值中分离小数值?

3
假设我有4.9的值。
我想要将4和.9分离...我该怎么做?
我可以使用FLOOR()来隔离4。那么.9呢?我该如何隔离它?
我正在使用t-sql sql server 2005/2008。
10个回答

13
4.9%1

你可以使用模数除以1。


@thyrgle.. 不是0.9是4.9/1整数除法的余数吗?但是答案很好+1。 - Gabriele Petrioli
@Gaby:是的,我想现在我想起来了,但我记得有人说它不是。 - thyrgle
一开始我并不相信它会起作用,直到我真正尝试了一下! - Roopesh Shenoy

5
Declare @money money

Set @money = 418.75

Select  convert(int,@money - (@money % 1))  as 'LeftPortion'
       ,convert(int, (@money % 1) * 100)    as 'RightPortion'

5
我能想到最简单的方法是:
SELECT IntegerPart = cast(4.9 AS int), DecimalPart = 4.9 - cast(4.9 AS int)

1
许多主机数据导入过程(在金融行业中很常见)需要一个固定宽度的列输入文件,其中用几列表示整数值和几列表示小数值来定义浮点数。例如,他们希望将数字4.019表示为000401900,其中前4个字符对应于整数部分,后5个字符对应于小数部分。
对于此应用程序,您需要进行相当数量的字符串操作,但是一个好的起点是获取一个查询,其中包含两个字段,一个包含4,另一个包含'01900'。
Parsename()与str()配合使用可以解决问题:
select integer_part = ltrim(str(4.019,25,0)), decimal_part = parsename(str(4.019, 25, 5),1)

str()函数在左侧填充空格,所以需要对整数进行ltrim处理。在这里,您可能只需将其转换为int类型即可。Parsename函数仅解析由句点分隔的字符串标记。

使用此方法时要注意一个问题。不要混淆decimal_part列的数据类型:

select integer_part = 1, decimal_part = 4
union all
select integer_part = ltrim(str(4.019,25,0)), decimal_part = parsename(str(4.019, 25, 5),1)

结果为:
integer_part    decimal_part
1   4
4   1900

这里原意的“01900”变成了“1900”。因此:
select integer_part = 1, decimal_part = cast(4 as varchar(32))
union all
select integer_part = ltrim(str(4.019,25,0)), decimal_part = parsename(str(4.019, 25, 5),1)

结果为:
integer_part    decimal_part
1   4
4   01900

0
使用 PatIndex 进行转换的方法如下:
declare @val nvarchar(10) = '4.9'
select 
    LEFT(@val,PATINDEX(N'%[.]%', @val)-1) Int_Val,
    RIGHT( @val, len(@val) - PATINDEX(N'%[.]%', @val) + 1) Dec_Val

0
Declare @dec decimal(8,2)

Set @dec = 23.98

Select Left(@dec, CharIndex('.',@dec)-1) as 'LeftPortion',
        RIGHT(@Dec, len(@dec) - CharIndex('.',@dec)) as 'RightPortion'

0

另一种方法是

选择 4.9-CAST(4.9 as int)


0

看一下parsename函数。我认为以下代码将产生所需的结果。 选择parsename(4.9,2)会得到4 选择parsename(4.9,1)会得到9 parsename的输出可以直接用作数字,例如 选择parsename(4.9,2)* 2会得到值8


0

使用以下查询: 使用PARSENAME函数拆分分隔的数据

SELECT value , PARSENAME(value,2) AS int_part,PARSENAME(value,1) AS DECIMAL_ONLY FROM table name

example:4.9


请尝试使用这个数字:420008631299.3897。不正确地返回了小数部分的"39",应该返回"3897"。 - Gabe

0

我尝试了不同的方法,但这个看起来是最好的,对我来说效果非常好。

-- 对于数字

Select  
Left(COLUMN_NAME, Case When CharIndex('.',COLUMN_NAME) = 0 Then 0 Else 
CharIndex('.',COLUMN_NAME)-1 END) as 'LeftPortion',  
RIGHT(COLUMN_NAME, len(COLUMN_NAME) - CharIndex('.',COLUMN_NAME)) as 
'RightPortion'  
From TABLE_NAME  

--查找最大长度

Select  
COLUMN_NAME,
  MAX(LEN(Left(COLUMN_NAME, Case When Ind = 0 Then 0 Else Ind-1 END))) as 
LenBeforedecimal,  
MAX(LEN(Right(COLUMN_NAME, LEN(COLUMN_NAME) - Ind))) as afterdecimal  
From  
(Select  
COLUMN_NAME,  
CHARINDEX('.', Cast(COLUMN_NAME as varchar(30))) as Ind  
From TABLE_NAME) a  
Group BY COLUMN_NAME

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接