首页 > 解决方案 > SQL Server - 浮点数与 varchar

问题描述

在 SQL Server 中,我将十进制数据存储在表中(从不用于连接或过滤)。这个十进制数据是可变的 - 80% 的时间它具有单个数字值(1、4、5),其余 20% 具有 16 位小数(0.8999999761581421、3.0999999046325684)。

我想知道如果我可以节省任何存储空间,varchar而不是float,或者我应该坚持,float因为这是数字数据?

标签: sqlsql-servervarcharsqldatatypes

解决方案


这是一个有趣的观察:

从数学值开始0.9

将其转换为二进制数。出于同样的原因,1/3 不能用以 10 为底的有限位数表示,数字 0.9 也不能用以 2 为底的有限位数表示。确切的数学值是:

0.1 1100 1100 1100 1100 1100 1100 1100......“1100”永远重复。

让我们将此值存储在 IEEE-754 单精度浮点值中。(在 SQL Server 中,这称为REAL类型)。为此,我们必须舍入到 23 个有效位。结果是:

0.1 1100 1100 1100 1100 1100 11 

将其转换为其精确的十进制等效值,您将得到:

0.89999997615814208984375

将其四舍五入到小数点后 16 位。你得到:

0.8999999761581421

巧合的是,您作为示例显示的价值。

如果你做同样的事情3.1,你会得到3.0999999046325684

您的所有输入是否可能只是小数点后一位数字,已存储为浮点值,然后转换回十进制?


推荐阅读