1

我有一个 PHP 脚本在 MySQL 数据库中插入行。每行都有一个字段“created_at”,其中填充了 PHP 函数 microtime(true) 的值,并作为双精度值插入。(微时间,因为我需要比秒更精确的东西)

我有另一个 PHP 脚本,它根据 created_at 字段选择行。

当我继续像这样选择时: SELECT * FROM `ms_voltage` WHERE created_at > 1302775523.51878 我收到一个结果集,第一行是created_at值的行。

这发生在我的 PHP 脚本和手动执行查询时的 PhpMyAdmin 中。但并非总是如此,也不是每个价值。真的只是偶尔。

这怎么可能?我没有要求大于/等于,我想要严格大于。我是否忽略了一些与类型相关的东西?

4

3 回答 3

4

DOUBLE 类型仅表示近似数值数据值。尝试使用 DECIMAL 类型。

于 2011-04-14T12:56:57.113 回答
4

是的,浮点运算有时可以做到这一点。要理解其中的原因,了解并非所有数字都可以以 10 为基数准确表示,也不是所有数字都可以以 2 为基数准确表示,这很有帮助。

例如,“1/3”可以以 10 为底写为 0.33333 或 0.33334。两者都不是真正的“正确”;他们只是我们能做的最好的。以 10 为底的“DOUBLE”可能是 0.3333333333 或 0.3333333334,这是两位数,但仍不“正确”。

最好的选择是使用 DECIMAL值,或使用 INT值(并将您的实际值乘以 10000 或 100000,以便将您关心的十进制数字放入该 int 中)。

于 2011-04-14T13:01:36.007 回答
2

你的列是浮点数吗?用 true 调用 microtime 会给你一个浮点数,它看起来像一个浮点数,在 .51878 之后会有你看不到的数字,所以这些数字使存储的值大于你在查询中的值。

除非你真的需要浮点数,否则我会将字符串结果转换为 int,甚至两列,分别为秒和微秒。然后您可以在已知值上使用 > 或 < 而不必担心浮点值的不精确性。

于 2011-04-14T13:00:07.650 回答