mysql SQL中的float、double和decimal有什么区别?

ztigrdn8  于 2023-10-15  发布在  Mysql
关注(0)|答案(3)|浏览(141)

我被要求添加一个列包含员工的工资奖金,这种价值观的例子是给予,如:1099.99或2.00。任务还要求我添加适当的数据类型,但我不知道该使用哪种类型。
我试着同时使用double和float,但无法区分结果。所以,帮我选择合适的数据类型。

inb24sb2

inb24sb21#

计算机科学家Brian Kernighan写道:
10.0乘以0.1几乎不等于1.0。
FLOATDOUBLE都是IEEE 754格式值。它们可以存储各种浮点值,包括非常小或非常大的值,但它们的缺点是存在舍入误差。
有关示例和详细信息,请阅读:

FLOAT存储32位,DOUBLE存储64位。这只是意味着您可以使用DOUBLE存储更多有效位,但它仍然具有相同的舍入行为。
这些数据类型适用于温度等科学测量,其中39度和38.99999997度之间的差异不会产生显著差异,特别是如果您只计算平均值或标准差。
由于舍入行为,FLOATDOUBLE不应用于存储货币值。
对于货币价值(例如你需要存储的工资),使用DECIMAL
DECIMALNUMERIC是精确缩放的数字。定义一个具有特定位数和小数点右侧特定位数的列。没有四舍五入问题;你存储的值会完全按照你存储的方式返回。您可以在数据中搜索特定值。
DECIMALNUMERIC是同义词。没什么区别实际上,如果使用NUMERIC作为类型,MySQL会默默地将其替换为DECIMAL
你可能还想读一下我的书SQL Antipatterns, Volume 1: Avoiding the Pitfalls of Database Programming中的“舍入错误”一章。

gab6jxml

gab6jxml2#

关于official documentation,我们有以下区别:

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

你可以询问浮动和固定数据库之间的区别,但这并不容易描述,尝试阅读相同的官方文档,例如this article

0tdrvxhp

0tdrvxhp3#

“没有区别”那是幸运的。
DECIMAL(m,n)赚钱。对于许多货币,DECIMAL(m,2),其中m足够大,即使CEO获得大幅加薪,您也不会溢出。DECIMAL occupies _approximately_ m/2 bytes. 1 billion dollars or Euros needs(11,2),占用5个字节。FLOATDOUBLE用于测量。FLOAT占用4个字节,大约有7个有效数字--足够表示温度、速度、高度等。DOUBLE(8个字节)提供大约16个有效数字;它可能需要从一些非常精确的科学研究。
纬度和经度--FLOAT虽然可以精确区分路上的两辆车,但不能区分拥抱的两个人。另请参见https://mysql.rjweb.org/doc.php/latlng#representation_choices
由于各种原因(许多没有在这里列出),没有一个表示可以根据乘法或除法时的银行规则进行“正确”的 * 舍入 *。加上美元和美分 * 将 * 与DECIMAl完全相同。

相关问题