将 FLOAT 转换为 NVARCHAR - 不同的小数位数
Posted
技术标签:
【中文标题】将 FLOAT 转换为 NVARCHAR - 不同的小数位数【英文标题】:Cast FLOAT to NVARCHAR - different number of decimal places 【发布时间】:2018-01-15 14:54:55 【问题描述】:查询:
SELECT CAST('123.1234' AS FLOAT) AS 'Float value', CAST(CAST('123.1234' AS FLOAT) AS NVARCHAR(MAX)) AS 'Text value'
返回:
Float value Text value
123,1234 123.123
为什么小数位数不同?
【问题讨论】:
How to convert float to varchar in SQL Server的可能重复 提示:使用适当的软件(mysql、Oracle、DB2 等)和版本标记数据库问题很有帮助,例如sql-server-2014
。语法和功能的差异通常会影响答案。请注意,tsql
缩小了选择范围,但没有指定数据库。
tsql 是 sql-server @HABO
【参考方案1】:
https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql
当表达式为浮点数或实数时,样式可以是下表中显示的值之一。其他值按0处理。
0(默认)最多 6 位。适当时以科学记数法使用。
1 始终为 8 位。始终以科学记数法使用。
2 始终为 16 位。始终以科学记数法使用。 3 始终为 17 位。用于无损转换。使用这种样式,可以保证每个不同的浮点数或实际值都转换为不同的字符串。适用于:Azure SQL 数据库,并从 SQL Server 2016 开始。 126、128、129 因遗留原因而包含在内,可能会在未来的版本中被弃用。以下代码将为您提供所需的结果
SELECT CAST('123.1234' AS FLOAT) AS 'Float value', convert(nvarchar(max),CAST('123.1234' AS FLOAT) ,128 ) AS 'Text value'
【讨论】:
【参考方案2】:如果您真的想从带有刻度的数字中取回文本,您需要使用数字或小数类型,并包含您想要称重的刻度的“刻度”第二个值。我相信 Float 只会做一个估计,而你需要使用它来进行更精确的估计。
Declare @Text varchar(16) = '123.1234'
SELECT
CAST(@Text AS FLOAT) AS 'Float value'
, CAST(CAST(@Text AS Float) AS NVARCHAR(MAX)) AS 'float'
, CAST(CAST(@Text AS Float(4)) AS NVARCHAR(MAX)) AS 'float with precision'
, CAST(CAST(@Text AS numeric(8,4)) AS NVARCHAR(MAX)) AS 'numeric with precision'
, CAST(CAST(@Text AS decimal(8,4)) AS NVARCHAR(MAX)) AS 'decimal with precision'
更多数字数据类型:https://academy.vertabelo.com/blog/understanding-numerical-data-types-sql/
【讨论】:
感谢回复,但万一每次小数位数不一样,结果总是有4位小数。 然后您将使用数字或小数,“比例”为 4,例如 numeric(8,4) 或 decimal(8,4)。您使用的类型并不意味着高度精确,然后想要四点比例尺。就像接受的答案所说的那样,得到你想要的答案可能会被弃用。我也会远离代码中的“文本”类型。以上是关于将 FLOAT 转换为 NVARCHAR - 不同的小数位数的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server:将FLOAT转换为NVARCHAR,最高精度,无需科学记数法
MSSQL数据类型nvarchar如何强行转为float类型.