var*_*run 3 sql sql-server varchar sqldatatypes
在 SQL Server 中,我将十进制数据存储在表中(从不用于连接或过滤)。此十进制数据是可变的 - 80% 的时间它具有个位数值(1、4、5),其余 20% 具有 16 位小数(0.8999999761581421、3.0999999046325684)。
我想知道我是否可以使用varchar而不是节省任何存储空间float,或者我是否应该坚持使用,float因为这是数字数据?
这是一个有趣的观察:
从数学值开始 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
Run Code Online (Sandbox Code Playgroud)
将其转换为其精确的十进制等价物,您将得到:
0.89999997615814208984375
Run Code Online (Sandbox Code Playgroud)
将其四舍五入到小数点后 16 位。你得到:
0.8999999761581421
Run Code Online (Sandbox Code Playgroud)
巧合的是,您作为示例展示的价值。
如果你做同样的事情3.1,你会得到3.0999999046325684
是否有可能您的所有输入都只是小数点后一位数字,这些数字已存储为浮点值,然后转换回十进制?