MySQL 提供了对精确数学的支持:数值处理会产生非常精确的结果,并对无效值进行高度控制。精确数学是基于以下两个特点:● 控制服务器接受或拒绝无效数据的严格程度的 SQL 模式。这些特性对数字操作有一些影响,并高度符合标准SQL:● 精确计算:对于精确值的数字,计算不会引入浮点错误。相反,使用的是精确的精度。例如,MySQL 将 .0001 这样的数字作为一个精确的值而不是一个近似值,并将其求和 10,000 次,得到的结果正好是 1,而不是一个仅仅“接近” 1 的值。● 定义良好的舍入行为:对于精确值数,ROUND()的结果取决于其参数,而不是底层C库的工作方式等环境因素。● 平台独立性:对精确数值的操作在不同平台(如 Windows 和 Unix)上是相同的。● 对无效值的处理控制:溢出和除零可被检测到,并可视为错误。例如,可以将对列来说太大的值视为错误,而不是截断该值以使其位于列的数据类型范围内。类似地,可以将除零视为一个错误,而不是产生 NULL 结果的操作。采用哪种方法取决于服务器SQL模式的设置。下面的讨论涵盖了精确数学如何工作的几个方面,包括可能与旧应用程序的不兼容。最后,给出了一些示例,演示了 MySQL 如何精确地处理数值运算。精确数学用于精确值操作的范围包括精确值数据类型(整数和 DECIMAL 类型)和精确值数字字面量。近似值数据类型和数字字面量作为浮点数处理。精确数值字面量有整数部分或小数部分,或两者都有。他们可能会有符号。例如: 1,.2,3.4,-5,-6.78,+9.10。近似值数字字面量用科学记数法表示,带有尾数和指数。任何一方都可以有符号。例如: 1.2E3, 1.2E-3,-1.2E3,-1.2E-3。两个看起来相似的数字可能会被区别对待。例如,2.34 是一个精确值(定点)数字,而 2.34E0 是一个近似值(浮点)数字。DECIMAL 数据类型是定点类型,并且计算是精确的。在 MySQL 中,DECIMAL 类型有几个同义词:NUMERIC, DEC, FIXED。整数类型也是精确值类型。FLOAT 和 DOUBLE 数据类型是浮点类型,计算是近似的。在 MySQL 中,FLOAT 或 DOUBLE 的同义词是 DOUBLE PRECISION 和 REAL。https://dev.mysql.com/doc/refman/8.0/en/precision-math-numbers.html