在mysql中,两个相等值的减法不是零

在mysql中,两个相等值的减法不是零,mysql,Mysql,为什么mysql中两个相等值的减法不等于零 两个字段类型都是双精度的。见下图 这被称为近似的精度。这不是一个错误,数据类型就是这样工作的。它们不能精确地存储数据。因此,如果这很重要,您应该使用定点数据类型,例如MySQL中的数据类型 另一方面,您可以始终使用精度增量进行浮点比较,如: SELECT `foo`, `bar`, IF(ABS(`foo`-`bar`)<1E-13, 0, `foo`-`bar`) AS zero_compared FROM t 选择 `福`,

为什么mysql中两个相等值的减法不等于零

两个字段类型都是双精度的。见下图
这被称为近似的精度。这不是一个错误,数据类型就是这样工作的。它们不能精确地存储数据。因此,如果这很重要,您应该使用定点数据类型,例如MySQL中的数据类型

另一方面,您可以始终使用精度增量进行浮点比较,如:

SELECT 
  `foo`,
  `bar`,
  IF(ABS(`foo`-`bar`)<1E-13, 0, `foo`-`bar`) AS zero_compared
FROM
 t
选择
`福`,
`酒吧`,

IF(ABS(`foo`-`bar`)这是一个近似的精度。这不是一个错误,数据类型就是这样工作的。它们不能精确地存储数据。因此,如果这很重要,您应该使用定点数据类型,比如MySQL

另一方面,您可以始终使用精度增量进行浮点比较,如:

SELECT 
  `foo`,
  `bar`,
  IF(ABS(`foo`-`bar`)<1E-13, 0, `foo`-`bar`) AS zero_compared
FROM
 t
选择
`福`,
`酒吧`,

如果(ABS(`foo`-`bar`)这个问题是由于浮点精度及其计算造成的。 为了明确您的问题,您也可以参考此问题:


此问题是由于浮点精度及其计算造成的。 为了明确您的问题,您也可以参考此问题:


这些字段是双精度的。@MitchWheatObligatory链接:数量不应该是双精度的。让它们成为双精度的integer@KenWhite,强制向上投票至强制链接:).OP:TL;DR:如果使用浮点数,则会出现错误,在本例中,该值很小,因此如果在进一步的算术运算中使用它,则不会有太大区别。这些字段是双精度的。@MitchWheatObligatory链接:数量不应是双精度的。请将它们设置为双精度integer@KenWhite,强制向上投票至强制链接:). OP:TL;DR:如果你使用浮点数,你会有错误,在这种情况下,这个值很小,所以如果你在进一步的算术运算中使用它,不会有太大的区别。实际上,我必须开发一个库存管理软件。其中库存数量可能在小数点后5位,因此我使用double。让我在商店里买一个19.87数量的产品。当我尝试将19.87的数量转移到另一家商店时,它显示没有足够的数量进行转移。现在我该如何管理它。使用
DECIMAL
。您的值将被精确地存储。有什么方法“商店中19.87数量的产品?@米奇麦产品单位为千克或毫克。Sahadat Hossain博士:这看起来极不可能,实际上我必须开发一个库存管理软件。其中库存数量可能在小数点后5位,因此我使用double。让我在商店里买一个19.87数量的产品。当我尝试将19.87的数量转移到另一家商店时,它显示没有足够的数量进行转移。现在我该如何管理它。使用
DECIMAL
。您的值将被精确存储“商店中怎么会有19.87个数量的产品?”米奇麦产品单位是千克或毫克。因此它可能是19.87千克@马里兰州Sahadat Hossain:这似乎极不可能