PHP 中的平方根

发布于 2024-08-10 04:21:49 字数 394 浏览 5 评论 0原文

为什么 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 中的 44.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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

生生不灭 2024-08-17 04:21:49

根据 PHP 手册,float sqrt ( float $arg ),sqrt() 始终返回一个浮点数。使用 is_int() 函数无法解决问题,因为它会检查数据类型并返回失败。

为了解决这个问题,您可以使用模数来测试它:(对于浮点模数必须是 fmod(),而不是整数模数的 % 运算符)

if (fmod(sqrt(16), 1) == 0) {
   // is an integer
}

如果您使用 PHP 5.2.0 或更高版本,我相信这也可以工作,但我还没有在这种情况下使用它来确定:

$result = sqrt(16);
if (filter_var($result, FILTER_VALIDATE_INT)) {
    // is an integer
}

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 (fmod(sqrt(16), 1) == 0) {
   // is an integer
}

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:

$result = sqrt(16);
if (filter_var($result, FILTER_VALIDATE_INT)) {
    // is an integer
}
初见 2024-08-17 04:21:49

不,它不是一个整数。 这是一个浮动

No, it's not an integer. It's a float.

小镇女孩 2024-08-17 04:21:49

API里说的很对,返回类型是float。

https://www.php.net/sqrt

 float sqrt  ( float $arg  )

返回 arg 的平方根。

Says it right in the API, return type is float.

https://www.php.net/sqrt

 float sqrt  ( float $arg  )

Returns the square root of arg .

狼性发作 2024-08-17 04:21:49

您可以使用floor函数获取该值的整数部分并减去原始值。如果差值 != 0 则它不是整数。例如

if (($sq - floor($sq)) == 0){
   YES
}else{
 NO
}

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.

if (($sq - floor($sq)) == 0){
   YES
}else{
 NO
}
负佳期 2024-08-17 04:21:49

因为它总是返回一个浮点数:

float sqrt(float $arg)

如果需要,您可以将其转换为整数:

intval(sqrt(16));

编辑,然后:

$sqrt = sqrt(16);

if (strpos($sqrt, '.') !== false)
{
    $sqrt = intval($sqrt);
}

else
{
    $sqrt = floatval($sqrt);
}

var_dump($sqrt);

Because it always returns a float:

float sqrt(float $arg)

You can cast it into a integer if you want:

intval(sqrt(16));

EDIT, Ok then:

$sqrt = sqrt(16);

if (strpos($sqrt, '.') !== false)
{
    $sqrt = intval($sqrt);
}

else
{
    $sqrt = floatval($sqrt);
}

var_dump($sqrt);
猥琐帝 2024-08-17 04:21:49

检查整数的另一种方法是将转换为字符串并使用 ctype_digit()

$result = sqrt(16);
if (ctype_digit((string)$result)) {
   // is an integer
}

当然,与在进行计算时使用模数相比,这是一种有点奇怪的方式。但在测试从表单发布的值时它很方便,因为它们一开始就是字符串。 需要注意的是,对于负整数,它将返回 false。

Another way to check for integers would be casting to a string and checking that with ctype_digit()

$result = sqrt(16);
if (ctype_digit((string)$result)) {
   // is an integer
}

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文