2011-04-14 48 views
1

我有一个PHP脚本插入MySQL数据库中的行。每行都有一个字段'created_at',它填充了PHP函数microtime(true)的值,并以双精度插入。 (microtime,因为我需要比第二个更精确的东西)MySQL比microtime时间戳大

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

当我继续前进,选择这样的: SELECT * FROM `ms_voltage` WHERE created_at > 1302775523.51878 我收到一个结果,作为第一行,该行与为created_at正是价值

这发生在我的PHP脚本和手动执行查询时从PhpMyAdmin内。但并非总是如此,并非为了每一个价值。真是一次又一次。

这怎么可能?我没有要求大于/等于,我要严格大于。 我可以忽略类型相关的东西吗?

+0

非常感谢所有(非常快)的回复。我现在明白这个问题好多了。我想我会转换为int来缓解任何舍入问题,这当然应该做到这一点。 再次感谢! – Dieter 2011-04-14 13:16:18

回答

4

是的,浮点算术有时可以做到这一点。为了理解为什么,有必要认识到,并非所有的数字都能以10为基准准确地表示,也不是所有的数字都能以2为基准准确表示。

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

,最好的选择是要么使用小数值,或才能使用INT值(和乘以你的实际值,也就是说,10000或100000〜让你在乎成INT十进制数字)。

4

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

2

是你的列浮点数吗?使用true调用microtime将为您提供一个浮点数,并且看起来像一个浮点数,它将在.51878之后有数字,您没有看到,所以这些数字使存储的值大于查询中的值。

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

+0

欢迎来到SO。我删除了你的个人笔记,因为这在社区中通常会被忽视。没有什么个人的。另请参阅常见问题解答。干杯 – 2011-04-14 13:14:26

+0

谢谢@Joris Meys - 没问题。 – 2011-04-14 13:35:13