我已经缩小了旧版SQL Server 2008数据库上的数据问题。
该列为“浮动”。SSMS将其中四个记录显示为“ 0.04445”,但是当我查询与第一个值匹配的所有记录时,仅返回四个中的三个。最后一条记录有所不同,我怀疑它与0.0000000001差不多,并且SMSS GUI对其进行了四舍五入以进行显示(?)。使用'<'运算符的结果类似('where my_column <0.04445'返回四个中的三个),这在调用的应用程序中造成了一些灾难性的计算错误。
我尝试将其强制转换为小数点('SELECT CAST(my_column as DECIMAL(38,20))FROM ...')但所有四个记录都刚刚返回0.044450000000000000000000000000
我怀疑在同一列中还有许多其他类似的错误,因为多年来已经以各种方式输入了数据。
有什么办法可以查看此列的完整值/精度/尾数,而不是四舍五入的值?
我无法更改架构或应用程序。
更新-使用“编辑前200行”功能,我可以看到其中大约四分之三为0.044449999999999996,而其他四分之一为0.04445。但是我无法在常规查询结果中显示出准确度
因此,您的问题实际上是关于SSMS的,而不是关于您的应用程序或SQL Server本身的,对吗?您想查看float
SSMS中的实际值而不进行舍入,对吗?
通过设计,SSMSfloat
在显示期间会四舍五入。例如,请参阅此答案。
但是,如果您使用CONVERT
函数显式将其转换为字符串,则可以看到存储在列中的实际值。
浮动和真实风格
对于浮点或实数表达式,样式可以具有下表中显示的值之一。其他值被处理为0。
0(默认),最多6位数字。适当时以科学计数法使用。
1始终为8位数字。始终以科学计数法使用。
2始终为16位数字。始终以科学计数法使用。
3始终为17位数字。用于无损转换。使用这种样式,可以保证每个不同的浮点数或实数值都可以转换为不同的字符串。
看起来样式3正是您所需要的:
convert(varchar(30), my_column, 3)
这是我的测试:
DECLARE @v1 float = 0.044449999999999996e0;
DECLARE @v2 float = 0.044445e0;
SELECT @v1, @v2, convert(varchar(30), @v1, 3), convert(varchar(30), @v2, 3)
我在SSMS中看到的结果是:
+------------------+------------------+-------------------------+-------------------------+
| (No column name) | (No column name) | (No column name) | (No column name) |
+------------------+------------------+-------------------------+-------------------------+
| 0.04445 | 0.044445 | 4.4449999999999996e-002 | 4.4444999999999998e-002 |
+------------------+------------------+-------------------------+-------------------------+
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句