在 SQL Server 中将 VARCHAR 列转换为 FLOAT 会截断数字

Converting VARCHAR column to FLOAT in SQL Server cuts off digits

提问人:kdickinson 提问时间:3/9/2023 最后编辑:marc_skdickinson 更新时间:3/9/2023 访问量:89

问:

我正在处理 SQL Server 数据库中的一列,该列从其源(Quickbase 或 Excel 文件)开始,需要以 (出于各种原因,主要是因为它是许多数据库表的主键,需要匹配现有格式)。ProjectIDVARCHAR(255)FLOAT

问题是,当我将列转换为 using 时,它会切断数字,我无法弄清楚原因。下表显示了实际值的原始状态和转换状态的示例。FLOATTRY_CONVERTVARCHAR(255)FLOAT

让我感到困惑的是:如果我单独使用左侧的任何一个值,它不会切断数字。当我整列时,它确实切断了数字 - 但仅适用于某些值。TRY_CONVERTTRY_CONVERT

  • SELECT TRY_CONVERT(FLOAT, '10189.13808')结果 10189.13808(预期结果)
  • SELECT TRY_CONVERT(FLOAT, '15336.19001')结果 15336.19001 (预期结果)
  • SELECT TRY_CONVERT(FLOAT, '13615.1115')结果 13615.1115 (预期结果)
ProjectID - 原始 VARCHAR(255) ProjectID - TRY_CONVERT(FLOAT) 整列
10189.13808 10189.1
15669.752 15669.752
4940.19 4940.19
15336.19001 15336.2
55.1115 55.1115
13615.1115 13615.1

我尝试先将列转换为 ,然后转换为 ,但它产生了相同的结果。我也试过.不幸的是,我无法保留该列,因为数据库中的一些现有进程使用 的 来获取非十进制部分,现在去更改它就会涉及它。DECIMAL(18,6)FLOATTRY_CASTVARCHARFLOORProjectID

如何在不损失比例的情况下获得这些值?FLOAT

sql-server 浮点类型 转换

评论

2赞 Dale K 3/9/2023
您了解浮点数的工作原理吗?它们无法准确存储所有值。它们仅用于科学用途。你所展示的所有内容都用小数表示会好得多。虽然这是一个奇怪的 PK - int 更好
0赞 siggemannen 3/9/2023
Float PK,这是第一次(我不是好意)。我认为你在这里没有提到什么,因为你的演员不应该删除小数。我猜你正在做其他事情,或者数据类型并不完全是你所说的。您需要提供整个 sql 以及表定义
0赞 AlwaysLearning 3/9/2023
为什么你认为你需要把这些细长的东西转换成?为什么不能在列的顶部创建一个主键约束?虽然它们有数字,但将这些视为数字可能是错误的 - 当你得到一个包含两个点的子项目时会发生什么,?floatvarchar(255)123.456.789
0赞 kdickinson 3/9/2023
@siggemannen 这不是主键,而是由存储 #(小数点后)和项目代码(小数点后)组成的项目 ID。它只会具有 ###.# .# 的格式。主键是完全独立的,不是我帖子的一部分,是一个整数列。
0赞 kdickinson 3/9/2023
@DaleK 这些值以 FLOAT 的形式成功存储在数据库的其他位置多次。我知道理论上可以用十进制更好地表示,但这是一个项目 ID,小数会添加尾随零,这在这种情况下是不可取的,也不起作用。我在这里试图得到的答案是,为什么TRY_CONVERT在单次转换的基础上不会影响数据的完整性,但为什么在一次转换整个列时会影响数据的完整性。

答: 暂无答案