sql - SQL Server - 浮点数与 varchar
问题描述
在 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
将其转换为其精确的十进制等效值,您将得到:
0.89999997615814208984375
将其四舍五入到小数点后 16 位。你得到:
0.8999999761581421
巧合的是,您作为示例显示的价值。
如果你做同样的事情3.1
,你会得到3.0999999046325684
您的所有输入是否可能只是小数点后一位数字,已存储为浮点值,然后转换回十进制?
推荐阅读
- model - 我如何获得 ARIMA 模型的置信区间值?
- python - 如何仅使用一个 for 循环将三个列表理解合并为一个?
- node.js - 如何在节点中模拟 SQL Server 连接池
- java - 如何将命令行参数传递给 IntelliJ 本身,以改变 IDE(不是我自己在 IDE 中的应用程序)的行为?
- android - 在 Kotlin 中使用 Android 中的 Multipart 和 Request Body 将图像上传到服务器
- python - 在python中如何从root用户获取普通用户名?
- android - Volley 并行 API 调用可能吗?
- angular - Angular中特定模式的字母数字字符串格式
- rust - 在循环中生锈的 & 在做什么?
- r - 如何在R中的数据框中对月份列进行分组