PHP float 和 int 为什么是以下结果?

$a=(float)55;
$b=100*0.55;
var_dump($a);
var_dump($b);
var_dump($a==55);
var_dump($b==55);
var_dump($b==$a);

输出结果:
float(55)
float(55)
bool(true)
bool(false)
bool(false)

WHY?

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 4
leo

$a - $b 你就知道

6年前 评论

引用下手册上的原文来分享下个人的理解.

  • 对于除字符串类型的值转换为浮点型,其情况类似于先将值转换成整型,然后再转换成浮点. 下面的松散比较存在类型转换,实质上是( float)55 与 (float)55的比较,因此可以解释结果为 true.
    $a=(float)55;
    var_dump($a==55);//实质上 var_dump((float)55 == (float)55)

    结果为

    true
  • 以十进制能够精确表示的有理数如 0.1 或 0.7,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999999991118....
    因此,0.55实际内部不是精确值,也就能解释下面的结果.
    $a=(float)55;
    $b=100*0.55;//实质上$b = (float)100 * 0.55;
    var_dump($b==55);
    var_dump($b==$a);
     //var_dump(abs($a-$b));//7.105427357601E-15    

    结果为

    false
    false
6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!