PHP中的浮点数

PHP浮点数精度

在PHP中,浮点数的字长和平台相关,通常最大值是 1.8e308 并具有 14 位十进制数字的精度(64 位 IEEE 格式)。

浮点数的精度有限。尽管取决于系统,PHP 通常使用 IEEE 754 双精度格式,则由于取整而导致的最大相对误差为 1.11e-16。非基本数学运算可能会给出更大误差,并且要考虑到进行复合运算时的误差传递。

此外,以十进制能够精确表示的有理数如 0.1 或 0.7,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式。

floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999999991118…

所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。

PHP浮点数比较

由于浮点数内部表示导致的精度缺失问题,所以比较浮点数是不能使用相等,而要判断比较的数值之间的差值是否在某个最下误差范围内。

这个最下误差也被称为机器极小值(epsilon)或最小单元取整数,是计算中所能接受的最小的差别值。

NaN

某些数学运算会产生一个由常量 NAN 所代表的结果。此结果代表着一个在浮点数运算中未定义或不可表述的值。任何拿此值与其它任何值进行的松散或严格比较的结果都是 FALSE。

由于 NAN 代表着任何不同值,不应拿 NAN 去和其它值进行比较,包括其自身,应该用 is_nan() 来检查。

PHP中数值的近似

在PHP中,经常会遇到对浮点数进行四舍五入,下面列出一些常用的PHP中的精度取舍函数。

float ceil ( float value ):对value向上取整(舍去小数部分并加1)

float floor ( float value ):对value向下取整(舍去小数部分)

float round ( float val [, int precision] ):将 val 根据指定精度 precision(十进制小数点后数字的数目)进行四舍五入

string sprintf ( string format [, mixedargs [, mixed $… ]] ):格式化字符串

PHP中强制类型转换

使用类型提示符

这种方式通过在需要转换类型的变量前加上类型提示符,如下:

(int) :转换为整形

(bool) :转换为布尔型

(float) :转换为浮点型

(string) :转换为字符串

(array) :转换为数组

(object) :转换为对象

使用类型转换函数

PHP中提供了类似 intval(),floatval() 系列的类型转换函数:

intval() :转换为整形

boolval() :转换为布尔型

floatval() :转换为浮点型

strval() : 转换为字符串

使用settype()

settype函数的声明为:bool settype ( mixed &var , stringtype ),用于设置变量的类型。type可以为:

“boolean” 或者 “bool”

“integer” 或者 “int”

“float” 或者 “double”

“string”

“array”

“object”

“null”

当改变类型成功后返回true,否则返回false

PHP中的类型判断

和 settype() 对于,可以使用gettype()函数来获取变量的类型:string gettype ( mixed $var ),返回值可能为:

“boolean”(从 PHP 4 起)

“integer”

“double” (由于历史原因,如果是 float 则返回“double”,而不是“float”)

“string”

“array”

“object”

“resource”(从 PHP 4 起)

“resource (closed)” (PHP 7.2.0添加)

“NULL”

“user function”(只用于 PHP 3,现已停用)

“unknown type”

对于 function 类型的变量,使用 function_exists() 和 method_exists() 来进行判断。

另外PHP中还有一系列类似 is_array() 系列的: bool is_TYPE(mixed $var) 函数可以判断类型,它们都接受一个变量参数,如果是指定类型,则返回true,否则返回false,如下:

is_bool(): 检测变量是否为布尔类型

is_string(): 检测变量是否为字符串

is_int(): 检测变量是否为整形

is_float(): 检测变量是否为浮点型

is_null(): 检测变量是否为空NULL

is_numeric(): 检测变量是否为数字或数字字符串

is_array(): 检测变量是否为数组

is_callable(): 检测变量是可以作为函数调用

is_object(): 检测变量是否为对象

is_resource(): 检测变量是否为资源类型

is_scalar(): 检测变量是否是一个标量

由于 gettype() 函数涉及到字符串比较,所以一般推荐使用 is_TYPE() 系列函数更加快速。

最后对于 object 对象,可以使用 get_class() 函数返回对象的类名,返回的类名包含完整的命名空间。

php中浮点型的精确度,PHP中的浮点精度和类型相关推荐

  1. 【C语言】浮点型数据在内存中的存储方式

    目录 一. 前言 二. 问题的引出 三. 两类浮点型数据(float.double)在内存中的存储方式 3.1 两类浮点型数据的存储模型 3.1.1 浮点型数据数值读取的通用模型 3.1.2 floa ...

  2. php中bc,php中BC高精确度函数库

    php中BC高精确度函数库,php bc math 包含了:相加,比较,相除,相减,求余,相乘,n次方,配置默认小数点数目,求平方,这些函数在涉及到有关金钱,高精度百分比时比较有用. 例如下图中使用准 ...

  3. java浮点型数据类型分为_java中的浮点型数据类型有哪几种

    java中的浮点型数据类型有哪几种 发布时间:2020-06-23 14:14:45 来源:亿速云 阅读:67 作者:元一 这篇文章将为大家详细讲解有关java中的浮点型数据类型,文章内容质量较高,因 ...

  4. java中的基本数据类型_Java中的基本数据类型和引用数据类型

    数据类型用于帮助确定变量可存放的一组值,以及可对这组特定值执行的操作.Java提供了在所有平台上都普遍支持的多种数据类型. 一.基本数据类型 byte:Java中最小的数据类型,在内存中占8位(bit ...

  5. java 指针 引用_java中的引用与c中的指针

    指针 首先要弄清楚指针和c中的指针是不一样的,前者是概念,后者是具体实例. 换句话说,C中的指针只是指针中的一种,其他语言也有指针,比如C++.但是我们同别人交流的时候,大都不会从概念上去交流,一般会 ...

  6. python语言中、复数类型中实数部分_python学习03.02:Python数值类型(整形、浮点型和复数)及其用法...

    实际开发中,我们经常需要使用数字记录游戏中用户的得分.游戏中角色的生命值.伤害值等信息,Python 语言提供了数值类型用于保存这些数值. 需要注意的是,Python 中这些数值类型都是不可改变的,也 ...

  7. java++biginter_Java中的BigInteger在ACM中的应用

    Java中的BigInteger在ACM中的应用 在ACM中的做题时,经常会遇见一些大数的问题,这是当我们用C或是C++时就会觉得比较麻烦,就想有没有现有的现有的可以直接调用的BigInter,那样就 ...

  8. python中替换字符串中字符_python替换字符串中的某个字符

    python_split_strip_replace使用方法 使用python时会经常要对字符串做一些处理,比如:分割字符串.去掉空格.替换字符串 中的某个字符等,下面介绍下这几个功能的使用. 一.  ...

  9. CVPR2020:点云分析中三维图形卷积网络中可变形核的学习

    CVPR2020:点云分析中三维图形卷积网络中可变形核的学习 Convolution in the Cloud: Learning Deformable Kernels in 3D Graph Con ...

最新文章

  1. 【C++】多线程与互斥锁【二】
  2. python编程中文版百度百科_1.2 搭建python+pycharm编程开发环境
  3. PYTHON学习0022:函数基本介绍----2019-6-17
  4. Android Studio --- [学习笔记]RadioButton、CheckBox、ImageView、ListView、TCP的三次握手
  5. Vue 实现图片在循环中 默认 和 选中 之间的点击切换
  6. php 获取当月的阴历值,PHP计算节日、节气、农阳历互换的代码
  7. 2.12 向量化的更多例子
  8. 遗传算法MATLAB工具包简介
  9. nsurl转nsdata_ios 中NSData 拼接成功,但写入本地种只有前面的data
  10. python颜色过渡
  11. 工作流任务的权限问题
  12. 蘑菇街直播实战技巧带你解决直播开发难题
  13. 90后游戏开发大神毛星云跳楼自杀!8年执着国产3A梦碎
  14. socket通信sendto函数导致Segmentation fault问题解决
  15. 分割整数构成字母字符串(动态规划)
  16. java的setbounds_Swing-setBounds()用法-入门
  17. Arduino智能小车设计(一)
  18. Bond随你入坑kubernetes之:入门篇 - 搭建多节点集群+Dashboard+监控
  19. 网页视频播放的去Flash方案
  20. 聊聊Kafka中值得我们学习的优秀设计

热门文章

  1. android中互斥的控件,Android控件之Radiobutton与RadioGroup
  2. 威联通nas怎么更换大硬盘_QNAP NAS在线RAID组态迁移及在线RAID容量扩充教程
  3. 空客fctm避免已识别风险_最远可航行15000公里,南航首架空客A350飞机首航,将先飞广州-上海航线再飞国际...
  4. linux可以打开浏览器嘛,Linux下怎样可以打开浏览器
  5. Linux虚拟内存管理(glibc)
  6. Cpp 对象模型探索 / 系列文章的索引
  7. 临时变量不能作为非const引用
  8. 2019江西高考理综和计算机,2019年江西高考理综是不是全国卷
  9. brew install php55redis,Mac下安装LNMP环境
  10. 聚焦可信AI与产业应用,百度联合发起千言计划实现情感分析2.0升级