如何在PHP中使用数字

引言

数字在编程中非常常见。它们用于表示屏幕尺寸尺寸、地理位置、金钱、点数、视频中经过的时间、游戏角色的位置和通过分配数字代码的颜色等内容。

能够在编程中有效地执行数学运算是一项需要开发的重要技能,因为你将经常与数字打交道。虽然对数学的深入理解肯定可以帮助你成为更好的程序员,但这不是先决条件。如果你没有数学背景,试着把数学看作是一种工具来完成你想要达到的目标,是一种提高你逻辑思维的方法。

我们将在PHP中使用两种数字数据类型,整数浮点数

  • 整数,可以是正、负或0,即:(…,-101,…)
  • 浮点数是包含小数点的实数(如9.0-2.25)。

本教程将介绍PHP中可用于数值数据类型的许多不同操作符,以及PHP如何处理“类型杂耍”和内置数学函数。

运算符

运算符是接受一个或多个值(或表达式,用编程术语来说)并产生另一个值(这样构造本身就成为一个表达式)的东西。操作符用于基本的决策,例如指示程序根据某个值执行某个操作。

赋值运算符

最基本的操作符是赋值操作符,一个等号:=。赋值运算符用于设置变量的值。变量就像一个盒子。许多不同的东西可以储存在一个盒子里。额外的项目可以添加到盒子。盒子里的物品可以重新排列,也可以给每个物品贴上标签。盒子也可以清空,新的东西可以添加到盒子里。这正是在代码中使用变量时发生的情况。给变量一个名字,然后给这个命名的变量赋值:

$box=3;
var_dump($box);
$box="Hello";
var_dump($box);

为了查看变量类型和值,我们使用了var_dump()函数而不是echo。变量$box被赋值为一个值为3的int。然后这个$box变量被赋值为"Hello"。这与清空盒子并添加新东西是一样的。现在,当调用var_dump()函数时,我们得到了关于$box变量值的完全不同的信息:

Outputint(3)
string(5) "Hello"

在第一次赋值之后,$box变量包含了整数值3。在第二次赋值之后,$box变量包含了一个匹配“Hello”的5个字符的字符串。
为了让我们的$box更有用,让我们看看下一种类型的操作符。

算术运算符

PHP的算术运算符在计算机程序中的作用与在计算器甚至纸笔上的作用相同。需要注意的重要方面是用于操作的符号。让我们看一下最常见的算术运算符。
加法(+)即从第一个值开始,将下一个值与该值相加。这可以使用数值本身,也可以使用包含该数值的变量:

$start=10;
var_dump($start+3);

结果就是这个等式的

Outputint(13)

减法(-)即从第一个值开始,从前一个值中减去或删除下一个值:

$start=10;
var_dump($start-3);

结果就是这个方程的差值

Outputint(7)

乘法(*)即从第一个值开始,并将其与下一个值相乘:

$start=10;
var_dump($start*3);

这与第一个数字和第二个数字相加相同:

$start=10;
var_dump($start+$start+$start);

它们都给出了相同的结果,即方程的乘积

Outputint(30)

除法(/)即第二个值可以与第一个值相乘多少次:

$start=10;
var_dump($start/3);

结果就是这个等式的

Outputfloat(3.3333333333333)

这里的结果是一个浮点数而不是整数,因为10不能整除3。我们可以告诉PHP通过添加(int)来给我们返回整数值,它将忽略.后面的任何值:

$start=10;
var_dump((int) $start/3);

给出一个整数形式的结果:

Outputint(3)

当需要除法方程的剩余值或余数时,称为模运算(%):

$start=10;
var_dump($start%3);
var_dump(3%$start);

第一个var_dump给出了前一个除法方程的剩余部分。如果等式颠倒过来,求模会返回’ 3 ',因为3除以10等于0,余数是原来的3:

Outputint(1)
int(3)

模运算通常用于创建奇数或偶数行的模式。当确定一行的整数计数是奇数还是偶数时,使用%2

var_dump(10%2);
var_dump(11%2);

偶数的结果总是0,因为偶数能被2整除,而奇数的结果总是1,因为它不能被2整除:

Outputint(0)
int(1)

PHP能够快速执行复杂的计算,并提供更多的工具来编写所需的计算。指数、百分比、平方根等操作都是可能的。在介绍这些数学函数之前,让我们先了解另一种运算符,它结合了赋值运算符和算术运算符。

算术赋值操作符

假设有一个篮子,里面有10个苹果。为了在代码中表示这一点,我们可以写$basket = 10。接下来,我们再摘5个苹果,把它们放进篮子。我们可以使用存储在$basket变量中的10的值,而不是整数10:$basket = $basket + 5。虽然这在技术上是正确的,但它相当冗余。我们只想在现有的篮子中再增加5个苹果。这就是算术赋值运算符的作用。我们可以写$basket += 5,而不是重复这个变量。这和前面的表达式完全一样。
它告诉代码:

  1. $basket的值
  2. 在这个值上加上5
  3. 将新值重新赋给$basket

你可以对其他算术运算符使用相同的原理:

表达式结果(假设$i = 10)
$i += 510 + 5; 结果为: $i = 15
$i -= 510 - 5; 结果为: $i = 5
$i *= 510 * 5; 结果为: $i = 50
$i /= 510 / 5; 结果为: $i = 2

如果Sammy决定吃掉篮子里的一些苹果,我们可以使用类似$basket -= 6的表达式,这将给$basket赋值一个整数9。到目前为止,程序看起来像这样:

$basket = 10;
$basket += 5;
$basket -= 6;
echo $basket;

当在最后一行回显$basket时,它给出了最终值:

Output9

Sammy一次可以吃很多苹果,而我一次只能吃一个苹果。

增量运算符

对于将数字加1,PHP提供了一个单独的递增操作符,它是一个双加号(++)。这可以用于独立地(在单独的一行中)增加变量,也可以直接在表达式中增加变量。让我们回到apple basket的例子,其中$basket变量的当前值是9

++$basket;
echo $basket;

第一行将当前值9加1,下一行给出结果:

Output10

我们可以在一行代码中完成同样的事情:

echo ++$basket;

首先,它将当前值(10)加1,下一行给出结果:

Output11

当再次输出$basket的值时:

echo $basket;

它证实了$basket变量实际上在上一行中被更新了,而不仅仅是添加到输出结果中:

Output11

在前面的每一行中,递增操作符都在变量之前使用。此预递增操作在任何其他操作(例如echo命令)之前应用于变量。使用++$basket等同于编写$basket += 1。递增操作符也可以放在变量之后,作为后递增操作符。当变量被独立设置时,顺序并不重要,但当它被用于表达式中时,顺序就变得重要了。让我们重复这些代码行,只不过这次把递增操作符放在变量后面:

$basket++;
echo $basket;

第一行将当前值11加1,下一行给出结果。这与前一个例子中递增前的代码行完全相同:

Output12

现在我们来看看增量后的差值:

echo $basket++;

echo操作发生在值递增之前,所以第二次echo的结果仍然显示$basket的值递增1之前:

Output12

最后一个echo命令确认在echo被处理后变量实际上被递增了:

echo $basket;

显示$basket的最终值:

Output13

除了递增操作符,PHP还允许我们使用递减操作符通过1递减一个值。

递减操作符

要减少一个值1,我们可以使用递减操作符,它是一个双减号(--)。与自增操作符一样,这个操作符也可以加在变量的前面或后面,但位置可能会影响程序的输出:

echo --$basket; # Pre-decrement
echo $basket--; # Post-decrement
echo $basket;

第一行在执行echo命令之前将当前值(13)中的1删除。下一行在计算后减值运算符之前执行echo命令,保持输出不变。同样,最后的echo表明$basket的值实际上在前一行中被减少了,给了我们一个减少的值:

Output12
12
11

在我们了解运算符优先级如何在结果中发挥重要作用时,请记住运算符的这种顺序。

运算优先级

运算符的优先级指定了它将两个表达式绑定在一起的“紧密程度”。这通常被称为“操作顺序”。这意味着不同的运算符被赋予更大的重要性,并且首先被应用。在计算数学方程时,乘法和除法总是在加减法之前进行。例如:

echo 1 + 5 * 3;

在这个表达式中,乘法(*)运算符的优先级高于加法(+)运算符,因此首先计算:5 * 3 = 15。然后执行加法运算1 + 15 = 16。这提供了16的最终结果:

Output16

如果不遵循运算的顺序,1 + 5会先计算,然后再进行乘法运算,得到6 * 3 = 18
递增和递减操作符不能应用于数字;它们与变量一起使用。然而,我们可以在一个等式中添加变量,在其中增加或减少该值。在使用这些递增或递减的变量时,方程要么在递增或递减操作之前执行,要么在之后执行:

$my_num = 8;
echo 7 + $my_num++ + 9;
echo $my_num;
echo 7 + --$my_num + 9;
echo $my_num;

在第一个echo行中,在后递增操作符增加$my_num的值之前,使用$my_num的原始值执行数学表达式。就好像我们写了echo 7 + 8 + 9;,得到的结果是24。从第二个echo可以看到,$my_num现在被设置为9。第二个数学方程是在减量操作之后执行的,这意味着$my_num的值现在被设置为8,并且数学方程本身是相同的。在数学方程执行之后,会执行后减量操作符,给出$my_num变量的最终结果:

Output24
9
24
8

分组操作

括号总是具有最高的优先级,提供了一种分组操作或强制优先级的方法。例如,给前面的等式加括号:

echo (1 + 5) * 3;

因为括号中的元素在乘法之前计算,所以结果是不同的:

Output18

总结一下数学方程的运算符优先级:

  1. 括号从左到右计算。
  2. 乘法和除法的计算从左到右。
  3. 使用从左到右的加减法计算最终结果。

变量类型变换

在声明或设置变量时,PHP不会定义变量类型。相反,变量的类型是由使用变量的上下文决定的。我们可以使用var_dump()来显示变量的详细信息,包括其类型:

$my_var = 'string';
var_dump($my_var);
$my_var = 1;
var_dump($my_var);

将字符串赋值给变量时,该变量就变成了字符串。如果将一个整型值赋给同一个变量,它就会变成一个整型:

Outputstring(6) "string"
int(1)

PHP还将根据等式的计算值设置类型:

$var1 = 1.2;
$var2 = 2;
$var3 = 12;
var_dump($var1 * $var2);
var_dump($var3 * $var2);
var_dump($var1, $var2, $var3);

如果有一个操作数是浮点数,那么两个操作数都将被计算为浮点数,结果将是浮点数,如第一个var_dump所示。否则,操作数将被解释为整数,结果也将是整数,如第二个var_dump所示:

Outputfloat(2.4)
int(24)
float(1.2)
int(2)
int(12)

从第三个var_dump可以看出,这不会改变操作数本身的类型;唯一的变化是计算操作数的方式和表达式本身的结果类型。
其他数据类型(如字符串和布尔值)也可以转换为数字。这可能会引起很多混乱,所以最好避免使用。尽管PHP将产生一个通知或警告,但它仍然会尽其所能将变量“调整”为可计算的类型。例如:

表达式返回值类型变换
2 * false0布尔值被转换为整数0
2 * true2布尔值被转换为整数1
2 * 'hi'0字符串被转换为整数0
2 * '1'2字符串被转换为整数1

虽然PHP的松散类型可以使编写代码更快更容易,但它通常使跟踪问题更困难。注意应用程序中使用的变量类型。

数学函数

函数是可以在程序中重复使用的语句块。PHP有许多内置函数,允许我们执行额外的数学计算。
当同时处理正数和负数时,你可以使用abs函数得到数字的绝对值:

echo abs(-1.3);

这会忽略数字前的+-,只返回数字本身:

Output1.3

在使用数字估计或获取浮点数的整数值时,有多种选择:

echo round(1.3);
echo round(1.5);
echo ceil(1.3);
echo floor(1.5);

round函数将返回最接近的整数,.5计算为更大的数。ceil函数总是向上取整,而floor函数总是向下取整:

Output1
2
2
1

任何圆的比值都是相同的。因此,任何圆的周长都可以通过将其直径乘以一个名为pi(π)的特殊数字来确定:

echo pi();
echo 4 * pi();

PHP中的pi函数返回pi的前14位,因为pi是一个无理数,这意味着它的十进制形式永远不会结束。这个函数可用于计算直径为4的圆的周长:

Output3.1415926535898
12.566370614359

无论是抛硬币还是掷骰子,当结果取决于概率时,随机数都是工具。PHP提供了rand函数来返回以下不可预测的随机结果:

echo rand();

该函数将显示一个介于0和计算机上配置的getrandmax之间的数字。当你需要更少的随机性,或者想增加最大值时,可以同时指定最小值和最大值。要返回一个随机的三位数:

var_dump(rand(100, 999));

每次调用rand函数,它都会返回一个100到999之间的3位数。

返回随机数的计算实际上不是随机的,因此当涉及安全和密码学时,PHP提供了更加密安全的函数。要生成一个适合于无偏结果的加密随机整数,例如洗牌或抽取中奖号码,请使用random_int函数:

var_dump(random_int(-999, 999));

使用random_int时,必须指定最小值和最大值。randrand_int都接受负数。
当为可以接受字节字符串的salt、keys或初始化向量生成加密安全的值时,使用指定字符串长度的random_bytes

var_dump(random_bytes(20));

每次你都会得到一个新的随机字节字符串,看起来像这样:

Outputstring(20) "q8?Ud;??W?p4?C????"

总结

本教程涵盖了处理整数和浮点数数据类型时将使用的许多操作符。它还演示了运算符的优先级和位置如何影响结果。这些结果让我们了解了PHP“处理”变量类型和可能导致的问题的方式。最后,对内置函数的简要介绍扩展了应用程序可用的数学选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/50097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VMware Workstation Pro 无法使用开机状态下拍的快照来克隆虚拟机,怎么解决?

环境: VMware Workstation Pro16.0 Win10 专业版 问题描述: VMware Workstation Pro有台虚拟机在开机状态下拍了个6.7快照这个win10初始版,现在想在这个快照下直接克隆,无法使用开机状态下拍的快照创建克隆 解决方案: 1.关闭当前虚拟机 2.到虚拟机文件夹复制一份Wind…

Python 在logging.config.dictConfig()日志配置方式下,使用自定义的Handler处理程序

文章目录 一、基于 RotatingFileHandler 的自定义处理程序二、基于 TimedRotatingFileHandler 的自定义处理程序 Python logging模块的基本使用、进阶使用详解 Python logging.handlers模块,RotatingFileHandler、TimedRotatingFileHandler 处理器各参数详细介绍 …

kingbase(人大金仓)数据库的常用知识点与简单巡检

查看服务是否已设为开机自启 systemctl list-dependencies |grep kingbasehttps://blog.csdn.net/gyqailxj/article/details/127290687

Apache Doris 入门教程36:文件分析和文件缓存

文件分析 通过 Table Value Function 功能,Doris 可以直接将对象存储或 HDFS 上的文件作为 Table 进行查询分析。并且支持自动的列类型推断。 使用方式​ 更多使用方式可参阅 Table Value Function 文档: S3:支持 S3 兼容的对象存储上的文…

智能电视与win10电脑后续无法实现DLNA屏幕共享

问题背景: 我用的是TCL电视,但是并不是最新,打开的方式是U盘->电脑,各位看自己情况,很多问题都大概率是智能电视问题。 情景假设: 假设你已经完成原先智能电视该有的步骤,通过DLNA&#xf…

第8天----【位运算进阶之----异或(^)】

今天我们来学习C语言中的异或。 文章目录 一、基本知识:异或操作满足的定律:(important) 二、拓展应用:1. 交换两个变量的值:2. 判断两个数的奇偶性:3. 检测落单的数(出现奇数次的数):检测丢失的数: 4. 加密…

TCP/UDP/IP协议简介

IP协议简介 特指为实现一个相互连接的网络系统上从源地址到目的地址传输数据包(互联网数据包) 所提供必要功能的协议 特点: 不可靠:不能保证IP数据包能够成功的到达它的目的地只能提供尽力而为的传输服务。 无连接:IP并不维护任何关于后续数…

vue3中reactive和ref的比较

1.reactive和ref函数的共同作用是什么? 用函数调用的方式生成响应式数据 2. reactive vs ref? 1.reactive不能处理简单类型的数据 2.ref参数类型支持更好但是必须通过.value访问修改 3.ref函数的内部实现依赖于reactive函数 3. 在实际工作中推荐使用哪个? …

rust写一个多线程和协程的例子

当涉及到多线程和协程时,Rust提供了一些非常强大的工具,其中最常用的库之一是tokio,它用于异步编程和协程。下面我将为你展示一个简单的Rust程序,演示如何使用多线程和协程。 首先,你需要在你的项目的Cargo.toml文件中…

Java学习笔记——(22)什么叫表达式、语句

关于这个问题不要觉得不重要,其实大有可以说的地方,这是一个很基础的东西,却有很多人都不是很清楚得了解。 表达式 是由运算符和运算对象组成的,单独的一个运算对象(常量/变量)也可以叫做表达式,这是最简单的表达式. eg.4,42,c…

SLAM-VIO视觉惯性里程计

SLAM 文章目录 SLAM前言IMU与视觉比较单目视觉缺陷:融合IMU优势:相机-IMU标定松耦合紧耦合基于滤波的融合方案:基于优化的融合方案: 前言 VIO(visual-inertial odometry)即视觉惯性里程计,有时…

java电子病历源码 电子病历编辑器源码 病历在线制作、管理和使用

电子病历在线制作、管理和使用的一体化电子病历解决方案,通过一体化的设计,提供对住院病人的电子病历书写、保存、修改、打印等功能。电子病历系统将临床医护需要的诊疗资料以符合临床思维的方法展示。建立以病人为中心,以临床诊疗信息为主线…

Git企业开发控制理论和实操-从入门到深入(二)|Git的基本操作

前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量博客汇总https://blog.csdn.net/yu_cblog/cate…

3d max插件CG MAGIC中的蜂窝材质功能可提升效率吗?

工作中能提升效率也都是大家所想的,对于设计师的一个设计过程中,可能想怎么样可以更快呀,是哪个步骤慢了呢? 这样的结果只能说会很多,但是建模这个步骤,肯定是有多无少的。 为了让模型更加逼真&#xff0c…

HDLBits-Verilog学习记录 | Verilog Language-Basics(2)

文章目录 9.Declaring wires | wire decl10. 7458 chip 9.Declaring wires | wire decl problem:Implement the following circuit. Create two intermediate wires (named anything you want) to connect the AND and OR gates together. Note that the wire that feeds the …

2023国赛数学建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 最短时…

行业追踪,2023-08-23

自动复盘 2023-08-23 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

uview2.0自定义tabbar

tabbar组件 <template><u-tabbar :value"tab" change"changeTab" :fixed"true" :border"true" :placeholder"true":safeAreaInsetBottom"true"><u-tabbar-item text"消息" icon"c…

缓存的变更(JVM本地缓存->Redis分布式缓存)

在一次需求修改中&#xff0c;下游的服务附加提出了&#xff0c;针对某个业务数据缓存的生效时间的要求 原JVM设计方案&#xff1a; 采用jvm本地缓存机制&#xff0c;定时任务30秒刷新一次 现在redis方案&#xff1a; 因为很多地方使用了这个业务数据缓存&#xff0c;使用方…

Apache Flume架构和原理

Apache Flume是一个开源的分布式、可靠的日志收集和聚合系统,旨在将大量的日志数据从不同的数据源(如应用程序、服务器、设备)收集到中心存储或数据湖中。Flume的架构设计允许用户在大规模数据流的情况下实现可靠的数据传输和处理。 Flume特性 Apache Flume是一个用于收集…