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


相关推荐

  • Oracle数据库双机热备方案「建议收藏」

    http://blog.chinaunix.net/uid-25806228-id-2141469.html1.方案综述OracleFailSafe是架构在MicrosoftClusterServer(MSCS)上的一个Oracle产品,为Oracle的一些产品(数据库、OracleApplicationServer等)提供高可用性。提供

    2022年4月6日
    45
  • js 闭包传参_JavaScript闭包演示

    js 闭包传参_JavaScript闭包演示有个网友问了个问题,如下的html,为什么每次输出都是5,而不是点击每个p,就alert出对应的1,2,3,4,5。闭包演示functioninit(){varpAry=document.getElementsByTagName(“p”);for(vari=0;ipAry[i].onclick=function(){alert(i);}}}产品一产品二产品三产品四产品五解决方…

    2022年6月15日
    64
  • 对角矩阵单位矩阵_矩阵乘单位矩阵等于

    对角矩阵单位矩阵_矩阵乘单位矩阵等于importnumpyasnp'''创建矩阵''''''创建矩阵:2维数组'''

    2022年8月6日
    8
  • oracle创建表的sql语句「建议收藏」

    oracle创建表的sql语句「建议收藏」1.oracle创建表sql语句

    2022年10月16日
    2
  • process returned -1073741571_0x0000007a电脑蓝屏

    process returned -1073741571_0x0000007a电脑蓝屏前言C++运行报错:Processreturned-1073741819(0xC0000005)是真的坑!!!申请的内存没有释放new后必须deletemalloc后必须free创建内核对象(比如CreateFile,CreateMutex,CreateThread),后必须释放内核对象句柄.创建内存映射文件,CreateFileMapping,MapViewOfFile后必须…

    2022年10月4日
    2
  • sklearn安装教程_sklearn库的使用

    sklearn安装教程_sklearn库的使用Sklearn(全称Scikit-Learn)是基于Python语言的机器学习工具,是机器学习中的常用第三方模块。它建立在NumPy,SciPy和Matplotlib之上。因此,在安装sklearn之前,需要先安装其三个依赖库numpy+scipy+matplotlib,具体安装步骤如下:1.进入官网下载相应的模块安装地址如下https://www.lfd.uci.edu/~gohlke/pythonlibs网站中包含了python中所需的子库。进去之后查找比较麻烦,可以在网址后

    2022年10月18日
    4

发表回复

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

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