我有一个浮点数列,其长度不同,我正在尝试将它们转换为varchar。
有些值超过了bigint的最大大小,所以我不能做这样的事情
cast(cast(float_field as bigint) as varchar(100))
我尝试使用十进制,但是数字的大小不同,因此也无济于事
CONVERT(varchar(100), Cast(float_field as decimal(38, 0)))
任何帮助表示赞赏。
更新:
样本值为2.2000012095022E + 26。
我有一个浮点数列,其长度不同,我正在尝试将它们转换为varchar。
有些值超过了bigint的最大大小,所以我不能做这样的事情
cast(cast(float_field as bigint) as varchar(100))
我尝试使用十进制,但是数字的大小不同,因此也无济于事
CONVERT(varchar(100), Cast(float_field as decimal(38, 0)))
任何帮助表示赞赏。
更新:
样本值为2.2000012095022E + 26。
Answers:
尝试使用该STR()功能。
SELECT STR(float_field, 25, 5)
另一个注意事项:此按钮在左侧留有空格。如果这是一个问题,请结合使用LTRIM:
SELECT LTRIM(STR(float_field, 25, 5))
Select LTRIM(Str(float_field, 38, 0))对您的数据有用吗?
Str函数中的最后一个参数。小数点后的位数。你看过我发布的链接吗?将零更改为10。 Select LTRIM(Str(float_field, 38, 10))
我发现唯一返回完全相同的原始编号的查询位是
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开始)
0浮点值将转换为0.0E0。我需要将float字段转换varchar为需要显示的NA时间NULL和0原样。我是通过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
这是我最终在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
首先转换为integer,然后转换为string:
cast((convert(int,b.tax_id)) as varchar(20))
如果使用CLR函数,则可以将浮点数转换为看起来像浮点数的字符串,而结尾没有所有多余的0。
[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编号一样。
select replace(myFloat, '', '')
来自REPLACE()文档:
如果输入参数之一为nvarchar数据类型,则返回nvarchar;否则,返回nvarchar。否则,REPLACE返回varchar。
如果任何一个参数为NULL,则返回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
根据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;
我刚遇到类似的情况,对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]
cast(float_field as varchar(max))否则我没有问题