资讯专栏INFORMATION COLUMN

PHP 浮点型与整型比较的小坑

付永刚 / 733人阅读

摘要:今天我们来看一个在中比较有意思的事浮点数你认为上面的代码会出现什么结果呢这种比较视情况而定其实很简单,因为在这里,我们使用了来做比较,所以这个结果很清晰的就是,因为我们左边是一个类似的数,右边是一个类型的数。如果你这样想的话,那你就错了。

今天我们来看一个在 PHP 中比较有意思的事:浮点数(floats)


你认为上面的代码会出现什么结果呢?1. true 2. false 3. 这种比较视情况而定

其实很简单,因为在这里,我们使用了 === 来做比较,所以这个结果很清晰的就是 false,
因为我们左边是一个 floats 类似的数,右边是一个 int 类型的数。
这是没什么可以特别讨论的。

那如果是这样呢?


就是我们使用 == 来比较的时候呢?

你可能会这样想:左边 120085,右边 120085,所以结果是 true。

如果你这样想的话,那你就错了。其实你运行上面的代码,结果回是 false。

然而,我是说然而!你再尝试修改一下数字,在运行一次代码,比如这样:


你会发现结果非常神奇,这个时候结果是 true,所以说,这种比较其实还真是视情况而定

那么问题出现在哪里呢?我们试着运行下面的代码:


结果会类似这样:

float(120085) int(120085)

好像没看出什么核心区别,我们这样再试试:

die(var_dump(120085 - 1200.85 * 100));

这个时候的结果应该是这样:

float(1.4551915228367E-11)

这就说明问题了,其实这个结果并不是 0 ,而是一个很小的 floats 类似的数。
如果你看 PHP 文档的时候:http://php.net/manual/zh/lang...
有注意那个很大的 Warning 的话,你应该就会明白:这里的核心问题其实就是浮点数的精度!

那这样的话,我们如何比较才是我们期望的值呢?

答案就是使用 round() 函数,像是这样:

die(var_dump(round(1200.85 * 100) == 120085));

所以吧,在使用 PHP 做这些精度计算比较的时候,一定要实测它的比较结果,或者是使用一些保险的手段进行比较,不然就会吃大亏!
关注公众号 codecasts ,每天更新 PHP Laravel 技能

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26114.html

相关文章

  • C语言:深度刨析数据在内存中存储——浮点型数据

    摘要:一浮点型数据及其取值范围二浮点型数据在内存中的存储一小数的二进制十进制转二进制整数部分与整数原理相同,按照整数二进制转换的规则,写成对应的二进制数。全为表示浮点数的最大值或者最小值。 ...

    YanceyOfficial 评论0 收藏0
  • python数据类型——数字

    摘要:例如返回的结果并不是,而是幂指数取余赋值给变量使用函数来查看变量类型整型数字的最大最小值在位系统中,一个整型个字节,最小值,最大值。事实上,中储存的值为,因为这是最接近的浮点数。 整型 Integers 整型运算,加减乘: 2 + 2 4 3 - 4 -1 4 * 5 20 在Python 2.7中,整型的运算结果只能返回整型,除法的结果也不例外。 例如12 / ...

    Jingbin_ 评论0 收藏0
  • 【数据类型存储原理】数据存储 - 深度剖析数据在内存中存储

    摘要:数据的存储前言数据类型汇总整型家族浮点型家族自定义类型指针类型。整型家族注在之后的标准规定,将类型数据划分为整型家族,因为字符在内存中会将其转化为码值进行存储。 ...

    yuanzhanghu 评论0 收藏0
  • 浅析二进制与int范围/IP计算及PHP应用

    摘要:前言对于程序员的世界,一切东西皆二进制。地址的计算根据常识,的每一位的区域只有在区间。根据它的二进制就明了。查询的话,数字效率是高于字符串的。 前言   对于程序员的世界,一切东西皆二进制。 PHP整型长度与二进制原理   我们一直说的整型有32位,很多人都说整型数最大值有2^32 -1,其实这个相对于无符号整型数,那么这里来谈论下有符号整型数。一个整型占四个字节,每个字节有8bit,...

    宋华 评论0 收藏0

发表评论

0条评论

付永刚

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<