PHP 中的平方根
为什么 PHP 中 sqrt
的输出不是“16”的整数?
示例
php > $fig = 16;
php > $sq = sqrt($fig); //should be 4
php > echo $sq;
4
php > echo is_int($sq); // should give 1, but gives false
php >
我觉得问题出在 PHP 与 Python 类似的隐藏内部表示中。 那么,在求平方根后,如何知道给定的数字是否为整数呢?
那么,如何在不使用正则表达式的情况下区分 PHP 中的 4
和 4.12323
呢?
Why is the output of sqrt
not an integer for "16" in PHP?
Example
php > $fig = 16;
php > $sq = sqrt($fig); //should be 4
php > echo $sq;
4
php > echo is_int($sq); // should give 1, but gives false
php >
I feel that the problem is in the internal presentation which PHP hides similarly as Python.
How can you then know when the given figure is integer after taking a square root?
So how can you differentiate between 4
and 4.12323
in PHP without using a regex?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
根据 PHP 手册,
float sqrt ( float $arg )
,sqrt() 始终返回一个浮点数。使用 is_int() 函数无法解决问题,因为它会检查数据类型并返回失败。为了解决这个问题,您可以使用模数来测试它:(对于浮点模数必须是 fmod(),而不是整数模数的 % 运算符)
如果您使用 PHP 5.2.0 或更高版本,我相信这也可以工作,但我还没有在这种情况下使用它来确定:
According to the PHP manual,
float sqrt ( float $arg )
, sqrt() always returns a float. Using the is_int() function won't solve the problem because it checks the datatype and returns a failure.To get around this, you can test it by using modulus instead: (must be fmod() for floating point modulus and not the % operator for integer modulus)
If you are using PHP 5.2.0 or later, I believe this would also work, but I haven't used it in this type of circumstance to be certain:
不,它不是一个整数。 这是一个浮动。
No, it's not an integer. It's a float.
API里说的很对,返回类型是float。
https://www.php.net/sqrt
返回 arg 的平方根。
Says it right in the API, return type is float.
https://www.php.net/sqrt
Returns the square root of arg .
您可以使用floor函数获取该值的整数部分并减去原始值。如果差值 != 0 则它不是整数。例如
You can use the floor function to get the integer part of the value and subtract the original value. If the difference is != 0 then its NOT an integer. e.g.
因为它总是返回一个浮点数:
如果需要,您可以将其转换为整数:
编辑,然后:
Because it always returns a float:
You can cast it into a integer if you want:
EDIT, Ok then:
检查整数的另一种方法是将转换为字符串并使用
ctype_digit()
当然,与在进行计算时使用模数相比,这是一种有点奇怪的方式。但在测试从表单发布的值时它很方便,因为它们一开始就是字符串。 需要注意的是,对于负整数,它将返回 false。
Another way to check for integers would be casting to a string and checking that with
ctype_digit()
Of course this is a somewhat weird way compared to using modulo when you are doing calculations anyway. But it is handy when testing values posted from a form, as they will be strings to begin with. A caveat is that it would return false for a negative integer.