sql-server - 将 float 转换为十进制 (SQL Server)

标签 sql-server tsql floating-point decimal

我需要在 SQL Server 中将 Float 转换为 Decimal(28,10)。我的问题是,由于 float 的性质以及转换的方式,简单地转换 float 可能会让我的用户觉得它是错误的数字。

例如:

Float:               280712929.22 
Cast as Decimal:     280712929.2200000300
What I think I want: 280712929.2200000000

我对 float 的工作方式有所了解(它是一种近似数据类型等),但不可否认,还不足以理解为什么它在末尾添加 300。它只是作为转换的副作用的垃圾,还是以某种方式更准确地表示了 float 实际存储的内容?对我来说,它看起来像是凭空提高了精度。

最终,我需要它准确,而且看起来“正确”。我想我需要得到那个底部数字,因为这样看起来我刚刚添加了尾随零。这可能吗?这是好主意还是坏主意,为什么?欢迎其他建议。

其他一些例子:

Float:           364322379.5731
Cast as Decimal: 364322379.5730999700
What I want:     364322379.5731000000

Float:           10482308902
Cast as Decimal: 10482308901.9999640000
What I want:     10482308902.0000000000

旁注:我将这些值放入的新数据库表可供我的用户读取。他们现在实际上只需要两位小数,但将来可能会改变,所以我们决定使用 Decimal(28,10)。长期目标是将我获取数据的浮点列也转换为十进制。

编辑:有时我拥有的 float 的小数位比我需要的多,例如:-0.628475064730907。在这种情况下,转换为 -0.6284750647 就可以了。我基本上需要我的结果在浮点末尾添加零,直到小数点后 10 位为止。

最佳答案

您需要进行一次四舍五入,一次将小数位添加回去(当然还有其他方法,使用STRROUND等):

DECLARE @c TABLE(x FLOAT);

INSERT @c SELECT 280712929.22;
INSERT @c SELECT 364322379.5731;
INSERT @c SELECT 10482308902;

SELECT x, 
    d = CONVERT(DECIMAL(28,10), x), 
    rd = CONVERT(DECIMAL(28,10), CONVERT(DECIMAL(28,4), x))
FROM @c;

结果:

x               d                       rd
--------------  ----------------------  ----------------------
280712929.22    280712929.2200000300    280712929.2200000000
364322379.5731  364322379.5730999700    364322379.5731000000
10482308902     10482308902.0000000000  10482308902.0000000000

如果您希望它准确且看起来正确,请停止使用 FLOAT,这是一种近似数据类型,对于大多数没有严格数学背景的人来说不符合逻辑。使用比您需要的更大的 DECIMAL 比例,并将其格式化为您现在需要的小数位数(在查询中,或创建 View ,或创建计算列)。如果您存储的信息比现在需要的多,您以后随时可以公开更多信息。您还可以选择不让用户直接访问您的表。

关于sql-server - 将 float 转换为十进制 (SQL Server),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11119343/

相关文章:

C - 将 float 存储到 char 数组并反转

sql-server - Microsoft SQL 查询 - 从第二个表中返回最后一条记录

SQL Server 获取 CHECK 的值

sql-server - 将查询结果存储到变量中并在存储过程中修改它

sql-server - 找出SQL Server中两个字符串之间的字符差异数

sql - 将存储过程执行到动态临时表中

tsql - SQL MERGE语句中的UPDATE-no-op

c++ - 将数组绑定(bind)到sql参数

java - JVM/CLR 上相同字节的不同浮点值

python 小数精度和 django DecimalField