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

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

大家好,又见面了,我是全栈君。

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

<?php
die(var_dump(1200.85 * 100 === 120085));

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

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

那如果是这样呢?

<?php
die(var_dump(1200.85 * 100 == 120085));

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

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

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

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

<?php
die(var_dump(1200.81 * 100 == 120081));

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

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

<?php 
var_dump(1200.85 * 100);
die(var_dump(120085));

结果会类似这样:

float(120085) int(120085)

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

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

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

float(1.4551915228367E-11)

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

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

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

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

所以吧,在使用 PHP 做这些精度计算比较的时候,一定要实测它的比较结果,或者是使用一些保险的手段进行比较,不然就会吃大亏!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111968.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mmc卡和sd卡区别「建议收藏」

    mmc卡和sd卡区别「建议收藏」转载:https://zhidao.baidu.com/question/296690750.html区别:1、尺寸不同:SD卡的技术是基于MultiMedia卡(MMC)格式上发展而来,大小和MMC卡差不多,尺寸为32mmx24mmx2.1mm。长宽和MMC卡一样,只是比MMC卡厚了0.7mm,以容纳更大容量的存贮单元。2、兼容性不同:SD卡与MMC卡保持着向上兼容,…

    2022年6月11日
    32
  • 遗传算法matlab程序简单实例_遗传算法的matlab实现

    遗传算法matlab程序简单实例_遗传算法的matlab实现遗传算法程序(一):  说明:fga.m为遗传算法的主程序;采用二进制Gray编码,采用基于轮盘赌法的非线性排名选择,均匀交叉,变异操作,而且还引入了倒位操作!function[BestPop,Trace]=fga(FUN,LB,UB,eranum,popsize,pCross,pMutation,pInversion,options)%[BestPop,Trace]=…

    2022年9月4日
    7
  • maven

    maven

    2021年5月28日
    121
  • 虚拟机lvm 扩容「建议收藏」

    虚拟机lvm 扩容「建议收藏」1.先在Vmware上,把虚拟机硬盘做扩展,如果有快照存在,磁盘可能是不可编辑状态,先删除快照后再扩展。2.现在打开虚拟机发现系统的磁盘空间已经扩了,但是硬盘分区可用空间没变,还是原来的30G[root@masterhome]#fdisk-lDisk/dev/sda:64.4GB,64424509440bytes,125829120sectorsUnits=…

    2022年6月20日
    28
  • noip2014普及组初赛答案_观光3路公交车路线

    noip2014普及组初赛答案_观光3路公交车路线风景迷人的小城Y市,拥有n个美丽的景点。由于慕名而来的游客越来越多,Y市特意安排了一辆观光公交车,为游客提供更便捷的交通服务。观光公交车在第0分钟出现在1号景点,随后依次前往2、3、4……n号景点。从第i号景点开到第i+1号景点需要Di分钟。任意时刻,公交车只能往前开,或在景点处等待。设共有m个游客,每位游客需要乘车1次从一个景点到达另一个景点,第i位游客在Ti分钟来到景点Ai,希望乘车前往景点Bi(Ai

    2022年9月24日
    0
  • Java——图书借阅系统「建议收藏」

    **项目需求:**为图书阅览室开发一个图书借阅系统,最多可存50本书,实现图书的管理。图书借阅系统具备以下功能:1.查看图书信息菜单选择查看功能,展示当前所有图书的相关信息,效果如下。case2: System.out.println(“—>查看图书”); System.out.println(“序号\t状态\t名称\t\t借出日期”); for(…

    2022年4月18日
    111

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号