as cast float server sql_如何在SQL Server中将float转换为varchar

我有一个浮点数列,其长度不同,我正在尝试将它们转换为varchar。

有些值超过了bigint的最大大小,所以我不能做这样的事情

cast(cast(float_field as bigint) as varchar(100))

我尝试使用十进制,但是数字的大小不同,因此也无济于事

CONVERT(varchar(100), Cast(float_field as decimal(38, 0)))

任何帮助表示赞赏。

更新:

样本值为2.2000012095022E + 26。

cast(float_field as varchar(max))否则我没有收到问题

您的转换值是2.2e + 026。 可能你没有得到这个问题:)

尝试使用STR()函数。

SELECT STR(float_field, 25, 5)

STR()函数

另一个注意事项:此按钮在左侧留有空格。如果这是一个问题,请与LTRIM结合使用:

SELECT LTRIM(STR(float_field, 25, 5))

我有 ************************* 。那是什么? :)

@hgulyan-Select LTRIM(Str(float_field, 38, 0))是否可用于您的数据?

@Martin Smith,它似??乎可以工作,但与十进制相同,因此我不确定其实际值(最后十位为零)。我想,真正的价值已经丧失了。谢谢!

@hgulyan-最后十个数字为零,因为这是Str函数中的最后一个参数。小数点后的位数。你看过我发布的链接吗?将零更改为10。Select LTRIM(Str(float_field, 38, 10))

我希望在SSMS中发出警告:"嘿,当您将错误的浮动电话字段转换为文本时,请准备好以科学的计数方式获得一个不错的电话号码!我们不够聪明,无法先使用ltrim(str)" ...

它是一个浮点数,不能精确到25位数字。 str(float_field,17,15)适用于1以下的数字,str(float_field,16,15)适用于1以下的数字(小于1的数字加0计入总数)

这不能解决更广泛的问题-在这种情况下,您需要指定精度和小数位数,这在查看数字时非常方便。但是,当从数据库中选择不同的浮点数时,该如何做呢?

我发现唯一返回完全相同的原始编号的查询位是

CONVERT (VARCHAR(50), float_field,128)

请参阅http://www.connectsql.com/2011/04/normal-0-microsoftinternetexplorer4.html

上述其他解决方案有时会在末尾四舍五入或添加数字

更新:根据下面的注释以及我可以在https://msdn.microsoft.com/zh-cn/library/ms187928.aspx中看到的内容:

CONVERT (VARCHAR(50), float_field,3)

应该在新的SQL Server版本中使用(Azure SQL数据库,并从SQL Server 2016 RC3开始)

对于@adinas +1,浮点值将按其转换,但0浮点值将转换为0.0E0。我需要将float字段转换为varchar,因为当需要显示NULL和0时,我需要显示NA。通过在查询中添加CASE语句来实现此目的,如下所示; CASE WHEN float_field IS NULL THEN NA WHEN float_field = 0 THEN 0 ELSE CONVERT(VARCHAR, float_field, 128) END AS float_As_VChar

根据Microsoft上的文档-msdn.microsoft.com/en-us/library/ms187928.aspx,出于遗留原因包括了128语法,并且在以后的版本中可能不再使用

不建议使用128,但在最新的SQL Server版本中似乎可以用3代替它。

这应该是公认的答案

这是我最终在sqlserver 2012中使用的解决方案(因为所有其他建议都具有截断小数部分的缺点或其他缺点)。

declare @float float = 1000000000.1234;

select format(@float, N'#.##############################');

输出:

1000000000.1234

(在我的情况下)这还有一个优势,可以使成千上万的分隔符和本地化变得容易:

select format(@float, N'#,##0.##########', 'de-DE');

输出:

1.000.000.000,1234

有用的话题,谢谢。

如果您希望像我一样删除零引线,则可以使用:

DECLARE @MyFloat [float];

SET @MyFloat = 1000109360.050;

SELECT REPLACE(RTRIM(REPLACE(REPLACE(RTRIM(LTRIM(REPLACE(STR(@MyFloat, 38, 16), '0', ' '))), ' ', '0'),'.',' ')),' ',',')

首先转换为integer,然后转换为string:

cast((convert(int,b.tax_id)) as varchar(20))

这将删除小数点后的数字(如果有)。因此,该解决方案是不准确的。

这可以帮助不四舍五入

declare @test float(25)

declare @test1 decimal(10,5)

select @test = 34.0387597207

select @test

set @test1 = convert (decimal(10,5), @test)

select cast((@test1) as varchar(12))

Select  LEFT(cast((@test1) as varchar(12)),LEN(cast((@test1) as varchar(12)))-1)

浮动只有最大15位数字的精度。因此,第15位之后的数字是随机的,转换为bigint(最多19位数字)或十进制无济于事。

我不明白。字段值为2.2000012095022E + 26。有什么解决方案?有没有?

通过转换为字符串,您获得的位数不能超过原始值中存储的位数。

那么我在第15位之后输了数字吗?

数据存在某种问题。我只需要用15位浮点数更新该值即可。我会接受您的答案,因为它描述了我在使用此数据时遇到的主要问题。谢谢。

试试这个,应该工作:

cast((convert(bigint,b.tax_id)) as varchar(20))

如果使用CLR函数,则可以将浮点数转换为看起来像浮点数的字符串,而结尾没有所有多余的0。

CLR功能

[Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)]

[return: SqlFacet(MaxSize = 50)]

public static SqlString float_to_str(double Value, int TruncAfter)

{

string rtn1 = Value.ToString("R");

string rtn2 = Value.ToString("0." + new string('0', TruncAfter));

if (rtn1.Length < rtn2.Length) { return rtn1; } else { return rtn2; }

}

create table #temp (value float)

insert into #temp values (0.73), (0), (0.63921), (-0.70945), (0.28), (0.72000002861023), (3.7), (-0.01), (0.86), (0.55489), (0.439999997615814)

select value,

dbo.float_to_str(value, 18) as converted,

case when value = cast(dbo.float_to_str(value, 18) as float) then 1 else 0 end as same

from   #temp

drop table #temp

输出量

value                  converted                  same

---------------------- -------------------------- -----------

0.73                   0.73                       1

0                      0                          1

0.63921                0.63921                    1

-0.70945               -0.70945                   1

0.28                   0.28                       1

0.72000002861023       0.72000002861023           1

3.7                    3.7                        1

-0.01                  -0.01                      1

0.86                   0.86                       1

0.55489                0.55489                    1

0.439999997615814      0.439999997615814          1

警告

所有转换后的字符串都将被截断到小数点后18位,并且没有尾随零。 18位精度对我们来说不是问题。而且,我们的FP编号的100%(接近100,000个值)看起来像字符串值一样,就像它们在数据库中作为FP编号一样。

我刚遇到类似的情况,并且对SSMS v17.9.1 / SQL 2017中出现的``非常大量''的舍入问题感到惊讶。

我并不是说我有解决方案,但是我发现FORMAT提供的数字看起来正确。我不能暗示这会减少进一步的舍入问题,或者在复杂的数学函数中很有用。

提供的T SQL代码应该清楚地证明我的观察,同时在需要时允许其他人测试他们的代码和思想。

WITH Units AS

(

SELECT 1.0 AS [RaisedPower] , 'Ten' As UnitDescription

UNION ALL

SELECT 2.0 AS [RaisedPower] , 'Hundred' As UnitDescription

UNION ALL

SELECT 3.0 AS [RaisedPower] , 'Thousand' As UnitDescription

UNION ALL

SELECT 6.0 AS [RaisedPower] , 'Million' As UnitDescription

UNION ALL

SELECT 9.0 AS [RaisedPower] , 'Billion' As UnitDescription

UNION ALL

SELECT 12.0 AS [RaisedPower] , 'Trillion' As UnitDescription

UNION ALL

SELECT 15.0 AS [RaisedPower] , 'Quadrillion' As UnitDescription

UNION ALL

SELECT 18.0 AS [RaisedPower] , 'Quintillion' As UnitDescription

UNION ALL

SELECT 21.0 AS [RaisedPower] , 'Sextillion' As UnitDescription

UNION ALL

SELECT 24.0 AS [RaisedPower] , 'Septillion' As UnitDescription

UNION ALL

SELECT 27.0 AS [RaisedPower] , 'Octillion' As UnitDescription

UNION ALL

SELECT 30.0 AS [RaisedPower] , 'Nonillion' As UnitDescription

UNION ALL

SELECT 33.0  AS [RaisedPower] , 'Decillion' As UnitDescription

)

SELECT UnitDescription

,              POWER( CAST(10.0 AS FLOAT(53)) , [RaisedPower] )                                                             AS ReturnsFloat

,        CAST( POWER( CAST(10.0 AS FLOAT(53)) , [RaisedPower] )  AS NUMERIC (38,0) )                                        AS RoundingIssues

, STR(   CAST( POWER( CAST(10.0 AS FLOAT(53)) , [RaisedPower] )  AS NUMERIC (38,0) ) ,   CAST([RaisedPower] AS INT) + 2, 0) AS LessRoundingIssues

, FORMAT(      POWER( CAST(10.0 AS FLOAT(53)) , [RaisedPower] )  , '0')                                                     AS NicelyFormatted

FROM Units

ORDER BY [RaisedPower]

根据Molecular的答案:

DECLARE @F FLOAT = 1000000000.1234;

SELECT @F AS Original, CAST(FORMAT(@F, N'#.##############################') AS VARCHAR) AS Formatted;

SET @F = 823399066925.049

SELECT @F AS Original, CAST(@F AS VARCHAR) AS Formatted

UNION ALL SELECT @F AS Original, CONVERT(VARCHAR(128), @F, 128) AS Formatted

UNION ALL SELECT @F AS Original, CAST(FORMAT(@F, N'G') AS VARCHAR) AS Formatted;

SET @F = 0.502184537571209

SELECT @F AS Original, CAST(@F AS VARCHAR) AS Formatted

UNION ALL SELECT @F AS Original, CONVERT(VARCHAR(128), @F, 128) AS Formatted

UNION ALL SELECT @F AS Original, CAST(FORMAT(@F, N'G') AS VARCHAR) AS Formatted;

选择

铸造(替换(转换(小数(15,2),acs_daily_debit),'。',',')为varchar(20))

来自acs_balance_details

您可以添加一些格式吗?

select replace(myFloat, '', '')

来自REPLACE()文档:

Returns nvarchar if one of the input arguments is of the nvarchar data type; otherwise, REPLACE returns varchar.

Returns NULL if any one of the arguments is NULL.

测试:

null ==> [NULL]

1.11 ==> 1.11

1.10 ==> 1.1

1.00 ==> 1

0.00 ==> 0

-1.10 ==> -1.1

0.00001 ==> 1e-005

0.000011 ==> 1.1e-005

修改后的Axel的响应在某些情况下会产生不良结果。

DECLARE @MyFloat [float];

SET @MyFloat = 1000109360.050;

SELECT REPLACE(RTRIM(REPLACE(REPLACE(RTRIM((REPLACE(CAST(CAST(@MyFloat AS DECIMAL(38,18)) AS VARCHAR(max)), '0', ' '))), ' ', '0'),'.',' ')),' ','.')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值