sql中的浮点数、双精度数和十进制有什么区别?[复制]

What's difference between float, double and decimal in sql? [duplicate]

提问人:Vedant Patel 提问时间:10/8/2023 更新时间:10/10/2023 访问量:75

问:

我被要求添加一列包含员工工资奖金的列,给出了该值的示例,例如:1099.99 或 2.00。任务还要求我添加适当的数据类型,但我对使用哪一种感到困惑。

我尝试同时使用 double 和 float,但结果之间没有区别。所以,帮我选择合适的数据类型。

MySQL 数据库 货币 SQLDataTypes

评论

1赞 t.niese 10/8/2023
浮点数(double,float)用于尺寸、时间、权重等内容。十进制用于与货币相关的事物,例如价格、薪水......
0赞 t.niese 10/8/2023
或者换句话说,如果像 0.1 + 0.2 这样的东西是 0.29999999999,你使用浮点,但如果 0.1 + 0.2 必须正好是 0.3,你就使用十进制。

答:

0赞 FriendlyDragon 10/9/2023 #1

关于官方文档,我们有以下区别:

  • FLOAT - 浮点类型(近似值),使用四个字节
  • DOUBLE - 浮点类型(近似值),使用 8 个字节
  • DECIMAL - 定点类型(精确值)

您可以询问浮动数据类型和固定数据类型之间的差异,但这并不容易描述,例如,尝试阅读相同的官方文档或本文

1赞 Bill Karwin 10/9/2023 #2

计算机科学家布莱恩·克尼汉(Brian Kernighan)写道:

10.0 乘以 0.1 几乎从来都不是 1.0。

FLOAT和 都是 IEEE 754 格式值。它们存储范围很广的浮点值,包括非常小或非常大的值,但它们的缺点是存在舍入误差。DOUBLE

有关这方面的示例和详细信息,请阅读:

FLOAT存储 32 位并存储 64 位。这仅意味着您可以使用 存储更多有效数字,但它仍然具有相同的舍入行为。DOUBLEDOUBLE

这些数据类型适用于温度等科学测量,其中 39 度和 38.9999999997 度之间的差异不会产生显着差异,尤其是当您只执行平均值或标准差等操作时。

由于舍入行为,并且永远不应该用于存储货币的价值。FLOATDOUBLE

对于货币值(例如,您需要存储的工资),请使用 .DECIMAL

DECIMAL并且是精确缩放的数字。定义具有特定位数和小数点右侧特定位数的列。没有四舍五入问题;您存储的值会完全按照您存储的值返回。您可以在数据中搜索特定值。NUMERIC

DECIMAL和 是同义词。没有区别。实际上,如果您使用 as 类型,MySQL 会静默地将其替换为 .NUMERICNUMERICDECIMAL

您可能还想阅读我的书《SQL Antipatterns, Volume 1: Avoid the Pitfalls of Database Programming》中的“舍入错误”一章。

0赞 Rick James 10/10/2023 #3

“没有区别”?那是幸运的。

用于赚钱。对于许多货币来说,,where 足够大,这样即使 CEO 获得大幅加薪,您也不会溢出。DECIMAL(11,2)' 并占用 5 个字节。DECIMAL(m,n)DECIMAL(m,2)moccupies _approximately_ m/2 bytes. 1 billion dollars or Euros needs

FLOAT用于测量。 占用 4 个字节,大约有 7 位有效数字——温度、速度、高度等都足够了。 DOUBLE'(8 字节)为您提供大约 16 位有效数字;它可能需要一些非常精确的科学研究。DOUBLEFLOAT

纬度和经度 -- 虽然可以精确区分道路上的两辆车,但不能区分两个拥抱的人。另请参阅 https://mysql.rjweb.org/doc.php/latlng#representation_choicesFLOAT

由于各种原因(此处未列出许多原因),在乘法或除法时,不能相信任何表示法都能根据银行规则“正确”四舍五入。美元和美分相加将与 .DECIMAl