【问题标题】:MySQL greater than or equal to operator is ignoring its or equal to obligationMySQL 大于或等于运算符忽略其或等于义务
【发布时间】:2010-09-08 11:21:51
【问题描述】:

如果一行中的价格是38.03,那么以下搜索限制应该都返回包含结果的行。

WHERE price >= '38.02' AND price <= '38.03'(有效)

WHERE price >= '20' AND price <= '100'(这行得通)

WHERE price >= '38.03' AND price <= '38.03'(这不起作用)

WHERE price >= '38.03' AND price <= '100'(这不起作用)

WHERE price >= '38.03'(这不起作用)

WHERE price <= '38.03'(这工作)

价格以浮点数形式存储在数据库中。

所以基本上,<= 正在工作,而 >= 没有。这有什么原因吗?

【问题讨论】:

  • 为什么需要用单引号将值括起来?
  • 这不是经典浮点比较问题的变体吗?...我忘记名字了...
  • 现在可能为时已晚,但价格(和金钱)应始终存储为 DECIMAL 类型,永远不要浮动。 dev.mysql.com/doc/refman/5.0/en/numeric-types.html
  • @Pekka웃 据我所知,这只是“浮点问题”,可能在某个地方出现了“精度”这个词。

标签: mysql operators


【解决方案1】:

请记住,float 在精度方面是有缺陷的数据类型。如果您将12 表示为浮点数,您将得到11.99999999999998 或其他内容。

'38.03'可以转换为十进制,或者其他更精确的数据类型(取决于RDBMS,我这里是笼统的),它会不同于浮点值。

float 是 32 位,低精度。 Double 工作得更好,是 64 位数据类型。一些系统中的十进制数据类型是 128 位数字数据类型,用于存储非常精确的数值,通常用于计价。

并且,跳过使用= 运算符比较float 值的习惯。浮点数用于近似和快速计算,只有与范围比较才能检查float 的值。这对基本上每一个系统都有效。

【讨论】:

  • +1 是的,只需改用DECIMAL。 MySQL 非常适合这些。
  • 即使 128 位也无法帮助您准确表达 0.1。金钱最好用整数表示,小数部分用整数表示。
  • @duffymo,你说的是定点小数。小数有2种类型,有些RDBMS有money数据类型,是2-4位小数的定点小数。
  • 感谢亚历山大的纠正。我将不得不研究它,因为我对舍入的担忧对于浮点数的所有二进制表示都是正确的。我仍然宁愿将两个整数用于整数部分和小数部分,以确保正确完成舍入。银行往往非常关心这些事情。
  • 完全同意外部表示和存储在磁盘上的位之间可能存在差异。但我会假设每次从外部字符串到内部位的转换都是一样的。所以应该可以这样做: INSERT IN table (id, price) VALUES (1, 38.03) SELECT * FROM table WHERE price = 38.03 来自 SELECT 的字符串“38.03”应该转换成与 INSERT 相同的位模式,所以找到记录
【解决方案2】:

当您使用引号 (') 时,您的变量将被视为字符串。我认为那是你的问题。

尝试:价格 >= 38.03 AND 价格

【讨论】:

  • 自己试一试,你会发现并没有什么不同。 :)
  • 给定上面的查询等于 WHERE price = 38.03
  • mysql> 选择 38.03 SELECT 38.03
  • 同样,mysql> SELECT 38.03 SELECT 38.03
猜你喜欢
  • 1970-01-01
  • 2021-08-01
  • 1970-01-01
  • 2011-03-13
  • 2013-09-02
  • 2011-01-25
  • 2017-03-31
  • 2019-12-07
  • 2022-09-24
相关资源
最近更新 更多