提问人:Vedant Patel 提问时间:10/8/2023 更新时间:10/10/2023 访问量:75
sql中的浮点数、双精度数和十进制有什么区别?[复制]
What's difference between float, double and decimal in sql? [duplicate]
问:
我被要求添加一列包含员工工资奖金的列,给出了该值的示例,例如:1099.99 或 2.00。任务还要求我添加适当的数据类型,但我对使用哪一种感到困惑。
我尝试同时使用 double 和 float,但结果之间没有区别。所以,帮我选择合适的数据类型。
答:
关于官方文档,我们有以下区别:
- FLOAT - 浮点类型(近似值),使用四个字节
- DOUBLE - 浮点类型(近似值),使用 8 个字节
- DECIMAL - 定点类型(精确值)
您可以询问浮动数据类型和固定数据类型之间的差异,但这并不容易描述,例如,尝试阅读相同的官方文档或本文。
计算机科学家布莱恩·克尼汉(Brian Kernighan)写道:
10.0 乘以 0.1 几乎从来都不是 1.0。
FLOAT
和 都是 IEEE 754 格式值。它们存储范围很广的浮点值,包括非常小或非常大的值,但它们的缺点是存在舍入误差。DOUBLE
有关这方面的示例和详细信息,请阅读:
- https://dev.mysql.com/doc/refman/8.0/en/problems-with-float.html
- https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
FLOAT
存储 32 位并存储 64 位。这仅意味着您可以使用 存储更多有效数字,但它仍然具有相同的舍入行为。DOUBLE
DOUBLE
这些数据类型适用于温度等科学测量,其中 39 度和 38.9999999997 度之间的差异不会产生显着差异,尤其是当您只执行平均值或标准差等操作时。
由于舍入行为,并且永远不应该用于存储货币的价值。FLOAT
DOUBLE
对于货币值(例如,您需要存储的工资),请使用 .DECIMAL
DECIMAL
并且是精确缩放的数字。定义具有特定位数和小数点右侧特定位数的列。没有四舍五入问题;您存储的值会完全按照您存储的值返回。您可以在数据中搜索特定值。NUMERIC
DECIMAL
和 是同义词。没有区别。实际上,如果您使用 as 类型,MySQL 会静默地将其替换为 .NUMERIC
NUMERIC
DECIMAL
您可能还想阅读我的书《SQL Antipatterns, Volume 1: Avoid the Pitfalls of Database Programming》中的“舍入错误”一章。
“没有区别”?那是幸运的。
用于赚钱。对于许多货币来说,,where 足够大,这样即使 CEO 获得大幅加薪,您也不会溢出。DECIMAL(11,2)' 并占用 5 个字节。DECIMAL(m,n)
DECIMAL(m,2)
m
occupies _approximately_ m/2 bytes. 1 billion dollars or Euros needs
FLOAT
用于测量。 占用 4 个字节,大约有 7 位有效数字——温度、速度、高度等都足够了。
DOUBLE'(8 字节)为您提供大约 16 位有效数字;它可能需要一些非常精确的科学研究。DOUBLE
FLOAT
纬度和经度 -- 虽然可以精确区分道路上的两辆车,但不能区分两个拥抱的人。另请参阅 https://mysql.rjweb.org/doc.php/latlng#representation_choicesFLOAT
由于各种原因(此处未列出许多原因),在乘法或除法时,不能相信任何表示法都能根据银行规则“正确”四舍五入。美元和美分相加将与 .DECIMAl
评论