• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

PHP整数、浮点数和数字字符串

php 中处理数字似乎是一个微不足道的概念,但它可能会令人困惑。起初看起来很简单,因为 PHP 提供了自动类型转换。例如,您可以将整数值分配给变量,并且该变量的类型将是整数。在下一行,您可以将字符串分配给同一个变量,然后类型将更改为字符串。不幸的是,这种自动转换有时会破坏您的代码。

PHP整数、浮点数和数字字符串  第1张

数值也有很多类型。在本教程中,您将了解 PHP 中的整数和浮点数,以及可用于确定我们正在处理的数字类型并在它们之间进行转换的函数。您还将学习如何在数字字符串之间转换整数和浮点数。

PHP中不同类型的数字

整数

PHP 中最基本的数字类型是整数。您可能已经知道,整数是没有任何小数部分的数字。例如,2 是整数,235298 或 -235298 也是如此。另一方面,2.0 和 3.58 是浮点数。稍后我们将更详细地讨论它们。

要记住的一件重要的事情是, int 如果数字没有小数部分,则不必是类型。例如,  16 * 2.5 is正是 40,但此结果的类型仍然是 a  float。当您将数字相乘时,如果至少有一个操作数是浮点数,则最终结果将是浮点类型。最终数字是否有小数部分并不重要。

此外,可以使用const ant 获得系统上 PHP 中整数的最大可能值PHP_INT_MAX。大小大于返回值的值 PHP_INT_MAX 将存储为浮点数,即使它看起来像整数。

通常,您会期望两个 type 变量相乘的结果是 int type  int。但是,在溢出的情况下并非如此。五个或六个不同数字的乘法很容易使您超出 int 类型的范围。例如, 的结果 128*309*32*43*309 在我的系统上是一个浮点数,因为它超过了 的值 PHP_INT_MAX,即 2147483647。

您可以使用该 is_int($value) 函数检查数字是否为整数类型。此函数有两个别名,称为 is_integer($value) 和 is_long($value)。它们都会给出相同的结果。

花车

您将处理的下一个最常见的数字类型是浮点数。与在大多数情况下只是没有小数点的整数不同,许多类型 float 可以用多种方式表示。值 3.14、  12.0、 5.87E+10和 3.56E-5 都是浮点数。

float 每当涉及小数或非常大的数字时,PHP 都会自动将数字转换为 类型。该 float 类型通常可以存储大小大约等于 的数字 1.7976931348623E+308。但是,这取决于平台。

该值 1.7976931348623E+308 可能看起来像一个非常大的值——它确实如此!——但浮点数的最大精度只有大约 14 位。任何位数多于该数字的数字都将失去其精度。这意味着您可以存储一个非常大的数字,但您将无法保留有关其确切值的信息——在许多情况下,浮点数只是一个近似值。

有两个函数可用于确定您正在处理的值是否为浮点数。这些函数是 is_float() 和 is_double()。实际上, is_double() 只是 的别名 is_float(),因此您可以使用其中任何一个并获得相同的结果。

无穷大和 NaN

在编写与数学相关的程序时,您可能还需要处理另外两种数值。这些值是无穷大和 NaN (不是数字)。这两个值都需要稍微解释一下,因为它们与您的预期不同。

PHP 中的无限与现实生活中的无限不同。在 PHP 中,任何高于平台上近似值的数值 PHP_FLOAT_MAX 都被认为是无穷大。所以 1.8e308 会给你 float(INF) 上 var_dump()。is_finite() 您可以使用and is_infinite() 函数检查数值是有限还是无限 。

同样, NaN 代表 不是数字 ,但它不检查值是否为数字。 该值  用于数学中不可能的数学运算的结果。例如,  将是 。同样,  也会 。您可以使用函数检查数学运算返回的值是否不是数字 。NaNlog(-1)NaNacos(5)NaNis_nan()

PHP中的数字字符串

就像 PHP 根据数值的使用或分配方式动态改变不同数字的类型一样,它也可以推断不同数字字符串的值,以便您将它们转换为数字。

该函数 is_numeric() 可以帮助您确定字符串或变量是否确实是数字。此函数将返回 true 以八进制、二进制或十六进制表示的数字。true 如果数字以指数表示法(如 )写入, 它也会返回 +16.52e39。

从 PHP 7.0.0 开始,当您将字符串传递给 时 ,仅 当字符串包含可选符号、一些数字、可选小数和可选指数部分is_numeric()时才会返回 。true这意味着以十六进制或二进制格式编写的数字字符串 false 将从 PHP 7.0.0 开始返回。

PHP 将在需要时将任何有效的数字字符串隐式转换为数字。以下示例应该可以帮助您更好地理解此过程。

<?php

$num = "3258712" + 12380;
// Output: int(3271092)
var_dump($num);

$num = "3258712" + "12380";
// Output: int(3271092)
var_dump($num);

$num = 3258712 + "12380";
// Output: int(3271092)
var_dump($num);

$num = 3258712 * "12380";
// Output: float(40342854560)
var_dump($num);

$num = 3258712 / "12380";
// Output: float(263.2239095315)
var_dump($num);

$num = 3258712 / "8";
// Output: int(407339)
var_dump($num);

$num = "53.9e4" + 10;
// Output: float(539010)
var_dump($num);

$num = "398.328" + 10;
// Output: float(408.328)
var_dump($num);

$num = "398328" + 0xfedd24;
// Output: int(17101084)
var_dump($num);

$num = 398328 + "0xfedd24";
// Output: int(398328)
var_dump($num);

?>

如您所见,在执行加法或其他操作之前,所有有效的数字字符串都已转换为各自的值。到底的类型 $num 取决于它的最终值。

在最后一种情况下,十六进制字符串 "0xfedd24" 不会转换为十进制值,因为 PHP 7 不认为它是有效的数字字符串。

将字符串和浮点数转换为整数

时不时地,您需要将一种类型的数值转换为另一种类型的数值。PHP 有多种功能和技术可以做到这一点。大多数情况下,转换是隐式的,您不必担心。但是,如果您必须明确地进行转换,这里提到的技术肯定会有所帮助。

您可以使用 (int) 或 (integer) 将任何值转换为整数。在浮点数的情况下,值将始终向零舍入。将字符串和浮点数转换为整数的另一种方法是借助 intval() 函数。两者都 (int) 以 intval() 相同的方式工作。

<?php

$float_a = 3598723.8258;
$int_cast = (int)$float_a;
// Output: 3598723
echo $int_cast;

$string_a = "98723.828";
$int_cast = (int)$string_a;
// Output: 98723
echo $int_cast;

$string_b = "987233498349834828";
$int_cast = (int)$string_b;
// Output: 2147483647 on a 32 Bit  machine
echo $int_cast;
// Output: 987233498349834828 on a 64 Bit  Machine
echo $int_cast;

$float_b = 21474836473492789;
$int_cast = (int)$float_b;
// Output: -6507212
echo $int_cast;
?>

您应该注意,将溢出的字符串转换为整数会将最终值设置为允许的最大整数值。但是,强制转换其值大于最大允许整数值的浮点数将导致值在 -2147483648 和 之间波动2147483647!

在某些情况下,您可能需要在不损失任何精度的情况下处理非常大的数字。例如,使用运算符的乘法 987233498349834828 和 3487197512 使用 不可能得到准确的结果* 。它会 3.4426781992086E+27 在浮点转换后给你。计算实际答案,即 3442678199208600117812547936,将需要使用像 BCMath这样的库。BCMath 通过将数字存储为字符串并手动对其进行算术运算来工作。请记住,如果您使用 BCMath,您将处理字符串而不是整数和浮点数。

某些库会希望您只将类型数传递 int 给它们的方法,但您可能会在不知不觉中为它们提供一个浮点值。这可能会发生,因为该值看起来像一个 int,因为它没有小数部分。is_int() 如果库使用诸如检查传递的数字是否为整数类型的函数,这几乎肯定会导致错误 。在这种情况下,首先使用 (int) or 将该数字转换为 intintval() 然后将其传递给库的任何函数或方法总是明智的。

出现这种情况的一个例子是,当您处理诸如 floor(), ceil()等 数学函数时floor() , ceil() 将始终返回一个浮点数,即使您向它们传递一个 int!

<?php

$int_a = 15*12;
// Output: int(180)
var_dump($int_a);

$num = floor($int_a);
// Output: float(180)
var_dump($num);

?>

将浮点数转换为整数的一个问题是您将丢失数字的小数部分。这可能是可取的,也可能不是可取的。在这种情况下,您可以使用类似的函数, floor() 并且仅当数字的实际值等于返回的值时才将数字转换为 int 类型 floor()。

<?php

$number = 16*2.5;

if(floor($number) == $number) {
    $fraction->setNumerator((int)$number);
} else {
    echo 'Did not set the numerator.';
    doSomethingElse();
}

?>

假设您有一个允许您进行小数运算的库,当您将一个 setNumerator() 非 int 类型的数字传递给它的方法时,它会引发异常。各种操作可能会将数字转换为浮点类型,即使它仍然是 int 类型的最小和最大范围内的整数。使用类似上面的代码将帮助您轻松处理此类情况。

在 PHP 中使用数字的技巧

数字本身可以无限大,但我们的计算机的计算机内存有限。在使用编程语言处理数字时,这可能会导致问题。

固定大小整数的问题

您可以在 64 位机器上存储为标准整数的最大数字是 9223372036854775807。任何结果大于该结果的计算都无法使用简单整数完成,需要其他解决方案。这意味着当结果有可能超过这些限制时,您不应该使用常规整数。较大数字的一种选择是使用浮点数。但是,它们也有自己的缺点! 

浮点数问题

浮点数在日常计算中非常常见。但是,您对数字所做的任何依赖于比较它们是否相等的事情都可能导致问题。这是因为浮点数的精度有限,因此它们之间的比较并不总是完美的。不仅如此,计算机是二进制系统,我们的数字系统是十进制的。它们之间的转换并不总是准确的。例如,0.1 不能用二进制精确表示——类似于 1/3 不能用固定数量的十进制数字精确表示。总是有一些精度损失。 

对于图形渲染或游戏应用程序,这种精度损失不是问题。但是,对于 ***ing 或电子商务应用程序,它可能会产生重大问题。避免此错误的一种方法是将您正在使用的数字转换为整数!例如,任何价值 12.01 美元的东西都可以在内部存储为 1201 美分的整数。当需要精度时,请始终考虑使用常规整数而不是浮点数。

无限精度数字

绕过上述两点中提到的限制的最佳方法是将数字存储为字符串。像 PHP 中的BCMath这样的任意精度库 可以帮助您解决这个问题。它带有许多有用的功能,使您可以更轻松地对非常大的数字进行加、减、除和乘,而不会丢失精度。

<?php

// Output: 3072022.352153
echo pow(145.37, 3);

// Output: 3072022.352153
echo bcpow('145.37', '3', 6);

// Output: 3072022.35215300000000000000
echo bcpow('145.37', '3', 20);

// Output: 7.485894688036E+64
echo pow(145.37, 30);

// Output: 74858946880359568408424850947105278367228015491111279108371943756.809526
echo bcpow('145.37', '30', 6);

// Output: 74858946880359568408424850947105278367228015491111279108371943756.809526310877954976795991720196399964284058833429514016256049
echo bcpow('145.37', '30', 60);
?>

如您所见,该 bcpow() 函数可以将精度设置为第三个参数定义的任意值。

当然,这个功能是有代价的——使用 BCMath 比 PHP 中的内置数字类型慢得多。除非您需要额外的精度和范围,否则最好使用内置数字类型。 

最后的想法

本教程介绍了 PHP 存储数字的不同方式以及如何确定数字是否属于特定类型。例如,您可以使用 和 之类的函数is_int() 来 is_float() 确定数字的类型并进行相应的处理。

正如您在教程中看到的,PHP 支持自动类型转换。这意味着有时较小的整数像 5 或 476 可能已经存储为浮点数而您没有意识到这一点。在只接受值的函数中使用这些数字 int 可能会导致异常或错误。我们了解到,解决这个问题的一个简单方法是显式地将这些数字转换为 int 如果它们没有小数部分并且它们的值在转换时不会改变。

阅读本教程后,您应该能够在使用预定义函数的各种操作后确定数字的类型或结果的最终类型,并在进行一些检查后将它们显式转换为特定类型。

与往常一样,如果您有任何问题或其他提示,欢迎您发表评论。


文章目录
  • PHP中不同类型的数字
    • 整数
    • 花车
    • 无穷大和 NaN
  • PHP中的数字字符串
  • 将字符串和浮点数转换为整数
  • 在 PHP 中使用数字的技巧
      • 固定大小整数的问题
      • 浮点数问题
      • 无限精度数字
  • 最后的想法