zoukankan      html  css  js  c++  java
  • 浅谈PHP数字字符串比较

    在比较两个数字字符串时,大家往往都会表现出惊讶的表情,为什么结果跟预期的不一样?以下是我踩过的坑,跟大家分享一下:

    1、'01' == '1' 

    结果:true   

    原因:当遇到形似数字的字符串,PHP会将此类字符串转为数字,然后做比较,所以会返回true 

    2、0 == 'a'   

    结果:true   

    原因:当数字跟字符串比较时,PHP会尝试将字符串转数字后进行比较,开头不为数字的字符串都会被转为0,所以0 == 0 

    举例:0 == 'acd'    返回true   

    3、'200' == '2e2'

    结果:true 

    原因:结合第一条,PHP尝试将两者转数字,在转的过程中,支持科学计数法,所以2e2=2*(10^2)=200,所以返回true

    举例:10 == '1e1' 返回true

    4、1 == '1a'

    结果:true

    原因:当数字跟字符串比较时,PHP会尝试将字符串转数字后进行比较,PHP将字符串尝试转为数字('1a' => 1),然后进行比较,所以返回true

    5、12345678900000000000 == 12345678900000000001,12345678900000000000 === 12345678900000000001

    结果:true

    原因:在PHP中,如果一个整数在定义或者计算赋值后超出了当前环境int型的最大值(目前是超出19位),php的做法是将这个整数转换为float型,并以科学计数法进行存储。而这一过程,会带来精度的损失,所以两者在损失精度并存储为float型的情况下,存储的值是一致的【float(1.23456789E+19)】,所以返回true

    注意:PHP7以前的版本支持将多进制的数值转换,所以'1'=='0x1'是成立的,但新版本是false,在比较字符串时,建议使用全等号(===)

  • 相关阅读:
    【原创】自己动手写工具----签到器[Beta 1.0]
    都2020了,还不好好学学泛型?
    ThreadLocal = 本地线程?
    从BWM生产学习工厂模式
    你还在用BeanUtils进行对象属性拷贝?
    JDK 1.8 之 Map.merge()
    Spring Boot认证:整合Jwt
    以商品超卖为例讲解Redis分布式锁
    如何从 if-else 的参数校验中解放出来?
    分布式全局唯一ID生成策略​
  • 原文地址:https://www.cnblogs.com/wupeiky/p/8430902.html
Copyright © 2011-2022 走看看