用PHP处理数字似乎是一个琐碎的概念,但可能会造成很大的混乱。 首先看起来很简单,因为PHP提供了自动类型转换。 例如,您可以将一个整数值分配给一个变量,并且该变量的类型将是一个整数。 在下一行,您可以将字符串分配给相同的变量,并且类型将更改为字符串。 不幸的是,这种自动转换有时会破坏您的代码。
数值也有很多类型。 在本教程中,您将学习PHP中的整数和浮点数,以及可用于确定我们要处理的数字类型并在它们之间进行转换的函数。 您还将学习如何在数字字符串之间来回转换整数和浮点数。
PHP中不同类型的数字
整数
PHP中最基本的数字类型是整数。 您可能已经知道,整数是不带小数部分的数字。 例如,2是整数,235298或-235298也是如此。 另一方面,2.0和3.58是浮点数。 我们将在后面更详细地讨论它们。
要记住的重要一件事是,如果数字没有小数部分,则它不必为int
类型。 例如, 16 * 2.5
恰好是40
,但是此结果的类型仍然是float
。 当您将数字相乘时,如果至少一个操作数是浮点数,则最终结果将是浮点数类型。 最终数字是否有小数部分都没有关系。
另外,可以使用常量PHP_INT_MAX
获得整数在系统上的PHP中可能具有的PHP_INT_MAX
。 大小大于PHP_INT_MAX
返回的值的PHP_INT_MAX
将被存储为浮点数,即使它看起来像是整数。
一般情况下,你会期望类型的两个变量的乘法结果int
为类型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
都是浮动。
每当涉及到小数或非常大的数字时,PHP都会自动将数字转换为float
类型。 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
将在var_dump()
上给您float(INF)
var_dump()
。 您可以使用is_finite()
和is_infinite()
函数检查数值是有限还是无限。
类似地, NaN
代表N OT A N棕土,但它不检查如果一个值是数值或没有。 NaN
值用于数学运算的结果,这在数学中是不可能的。 例如, log(-1)
将为NaN
。 同样, acos(5)
也将是NaN
。 您可以使用is_nan()
函数检查数学运算返回的值是否不是数字。
PHP中的数字字符串
正如PHP根据使用或分配其值的方式动态更改不同数字的类型一样,它也可以推断不同数字字符串的值,以便您将它们转换为数字。
函数is_numeric()
可以帮助您确定字符串或变量是否确实是数字。 对于以八进制,二进制或十六进制表示的数字,此函数将返回true
。 如果数字以+16.52e39
类的指数表示,也将返回true
。
从PHP 7.0.0开始,当您将字符串传递给is_numeric()
,仅当字符串包含可选符号,一些数字,可选十进制和可选指数部分组成时,它才返回true
。 这意味着以十六进制或二进制格式编写的数字字符串将从PHP 7.0.0开始返回false
。
当需要时,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
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)
或intval()
将该数字转换为int,然后将其传递给该库的任何函数或方法。
发生这种情况的一个例子是当您处理诸如floor()
, ceil()
等数学函数时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()
类的函数,并且仅在其实际值等于floor()
返回的值时,才将数字强制转换为int类型。
<?php
$number = 16*2.5;
if(floor($number) == $number) {
$fraction->setNumerator((int)$number);
} else {
echo 'Did not set the numerator.';
doSomethingElse();
}
?>
假设您有一个允许执行小数运算的库,当您将数字传递给非int类型的setNumerator()
方法时,该库将引发异常。 即使数字仍然是int类型的最小和最大范围内的整数,各种运算也可能将数字转换为float类型。 使用上面的代码将帮助您轻松处理此类情况。
最后的想法
本教程介绍了PHP存储数字的不同方法,以及如何确定特定类型的数字。 例如,您可以使用is_int()
和is_float()
之类的函数来确定数字的类型并进行相应的处理。
如您在本教程中所见,PHP支持自动类型转换。 这意味着有时较小的整数(例如5
或476
可能在没有意识到的情况下被存储为浮点数。 在仅接受int
值的函数中使用这些数字可能会导致异常或错误。 我们了解到,解决此问题的一种简单方法是,如果没有小数部分并且在转换时其值不变,则将这些数字显式转换为int
。
阅读完本教程后,您应该能够在使用带有预定义函数的各种运算后确定数字的类型或结果的最终类型,并且在进行一些检查之后还可以将它们显式转换为特定类型。
与往常一样,如果您有任何疑问或其他提示,欢迎发表评论。
翻译自: https://code.tutsplus.com/tutorials/php-integers-floats-and-number-strings--cms-32048