SQL 服务器 - float 与 varchar

SQL Server - float vs varchar

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

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

总是使用最合适的数据类型!由于这显然是 numerical 数据 - 使用数字类型。这将允许例如对值求和,按这些值排序 - 这些是数字 - 所以请按原样处理和存储它们!

如果您需要支持分数,您可以可以使用FLOATREAL,但它们因舍入错误等而臭名昭著。使用DECIMAL(p,s) 避免了这些陷阱 - 它稳定,精确,不易出现舍入错误。所以这将是我合乎逻辑的选择。

有关如何定义 p(精度 - 总体位数)和 s(比例 - 位数 小数点后).

顺便说一句:那些存储在 更少 字节中的 varchar 列足以容纳这些值!

这是一个有趣的观察结果:

从数学值开始0.9

将其转换为二进制数。同理1/3不能用10进制的有限位数表示,0.9这个数也不能用2进制的有限位数表示。精确的数学值为:

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

让我们将此值存储在 IEEE-754 single-precision floating-point 值中。 (在 SQL 服务器中,这称为 REAL 类型)。为此,我们必须四舍五入到 23 位有效位。结果是:

0.1 1100 1100 1100 1100 1100 11 

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

0.89999997615814208984375

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

0.8999999761581421

这恰好是您作为示例显示的值。

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

有没有可能你所有的输入都是小数点后一位数字,存储为floating-point值,然后转换回小数?