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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 虚地址转化为内存地址_转换法与转化法

    虚地址转化为内存地址_转换法与转化法页式地址变换虚地址结构虚地址是用户程序中的逻辑地址,它包括页号和页内地址(页内位移)区分页号和页内地址的依据是页的大小,页内地址占虚地址的低位部分,页号占虚地址的高位部分。假设页面大小为1024字节,虚地址占用2个字节(16位)虚地址转换为内存地址计算如果,虚地址(逻辑地址、程序地址)以十六进制、八进制、二进制的形式给出第一步,将虚地址转换成二进制的数;第二步,按页的大…

    2025年7月12日
    3
  • c++线程间通信_c语言两个线程如何通信

    c++线程间通信_c语言两个线程如何通信c++线程间通过PostThreadMessage和GetMessage函数进行通信,下面用代码演示两个线程间的通信://ConsoleApplication1.cpp:定义控制台应用程序的入口点。//#include<stdio.h>#include<windows.h>usingnamespacestd;DWORDWINAPIThreadFun1(LPVOIDparam);DWORDWINAPIThreadFun2(LPVOIDpara

    2022年10月6日
    2
  • webgame开发中配置存储的介绍「建议收藏」

    webgame开发中配置存储的介绍「建议收藏」webgame世界的基础数值都是事先配置好的,在运行的时候可以随时读取,是属于非常重要和必不可少的部分,而且数据量也不少。这样的数据在开发中的存储也就变得重要了,需要保证效率、性能、安全等,一般的做法有使用xml文本文件保存、静态数组保存和数据库直接保存。 xml文本文件保存优点: 共享性强,几乎每种语言都可以读取和解析xml文件,方便多语言混合开发。 结构清晰,xml的结构很

    2022年5月2日
    43
  • 宽度学习系统:一种不需要深度结构的高效增量学习系统「建议收藏」

    宽度学习系统:一种不需要深度结构的高效增量学习系统「建议收藏」宽度学习系统:一种不需要深度结构的高效增量学习系统本文是对陈俊龙教授团队“BroadLearningSystem:AnEffectiveandEfficientIncrementalLearningSystemWithouttheNeedforDeepArchitecture”的中文综述,原文将在IEEETransactionsonNeuralNetwor…

    2022年5月21日
    32
  • PD快速充电协议(转)[通俗易懂]

    PD快速充电协议(转)[通俗易懂]来源-作者@:http://www.elecfans.com/d/647097.html建议读者阅读原文,确保获得完整的信息1.PD充电协议是什么意思    PD充电协议是USB-IF组织公布的功率传输协议,它可以使目前默认最大功率5V/2A的type-c接口提高到100W,同时谷歌宣布Android7.0以上的手机搭载的快充协议必须支持PD协议,意在统一快充市场。2.PD协议快充是什么意思   …

    2025年8月8日
    4
  • getParameterValues中文乱码[通俗易懂]

    getParameterValues中文乱码[通俗易懂]如果想获得一个元素的value情况时:可以设置为:Stringstr=newString(request.getParameter(“interest”).getBytes(“iso-8859-1”),“utf-8”);如果你获得的是得到复选框中选中的元素value值(有多个),只用在Servlet文件里添加request.setCharacterEncoding(“UTF-8”)…

    2022年7月22日
    21

发表回复

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

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