PHP零浮点返回true

4

我在MySQL数据库表中有一个类型为decimal(15,4)的字段。

我以前从未遇到过这种情况,但如果值为0.0000,我的PHP if语句将返回true!

为了进行健全性检查,我甚至执行了以下操作:

if(0.0000) echo "Hello World";

果然,"Hello World"被输出了。到底发生了什么?有人有什么想法吗?


您的健全性检查对我来说很好,PHP v5.2.6。 - Toto
是的,在我的服务器上使用 PHP 5.3.13 进行评估时,结果如预期。但在另一台安装了相同 PHP 版本的服务器上,评估结果不正确。我认为可能是 php.ini 中的某些设置问题。:\ - Andy
@Andy,不是针对你,但我不相信你 :) 我觉得你在一连串的调试尝试中犯了一个诚实的错误。 - goat
@chris 真是尴尬,你说得对:\ 我想这就是我从早上9点工作到凌晨4点半的后果。对不起,浪费了你们的时间! - Andy
4个回答

4
如果从数据库中取出的是浮点数,它将被视为字符串而不是数字值。你可以尝试以下方法:
if(floatval($value) > 0) { ... }

其中$value包含来自数据库的值。


2

我认为问题在于你从数据库中获取的是字符串"0.0000",而不是0.0000

请尝试使用以下代码:

if ((int)$your_value) echo "Hello World";

健全性检查不包括字符串。 - Kendall Frey
@KendallFrey 他说这个值是从数据库中获取的,所以我认为问题中的代码只是虚拟的。 - xdazz
他说他对那个语句进行了一次合理性检查。我非常确定字面值不是来自数据库。 - Kendall Frey
Kendall是正确的,它从数据库中评估为真,所以我在语句中放置了字面值0.0000并得到了相同的结果。 - Andy
@Andy 在你的机器上,var_dump((bool)0.000) 的结果是什么? - xdazz

1
我知道这个问题已经开放了很长时间,但我认为它可能会对其他人有所帮助。
浮点数实际上是实数的近似值。你会发现,并不是所有的实数都可以用浮点数表示。这可能是你得到意外结果的原因。你应该阅读一下http://php.net/manual/en/language.types.float.php
如果你需要更高的精度,你应该考虑使用BC Math lib's http://php.net/manual/en/ref.bc.php

1

我的PHP版本(5.3.3)上没有这种行为。

我建议在检查之前将数字转换为boolif ((bool) $float)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接