UnrealEngine
V2EX  ›  PHP

PHP 浮点数,为什么 1890 / 100 * 100 结果为正确值 1890,但是 floor(1890 / 100 * 100)结果为 1889?

  •  
  •   UnrealEngine · Mar 2, 2021 · 3664 views
    This topic created in 2073 days ago, the information mentioned may be changed or developed.

    我知道 php 浮点数有对应的计算函数,但是上面这个例子还是不知道原因

    12 replies  •  2021-03-06 20:00:21 +08:00
    justseemore
    justseemore
    Mar 2, 2021
    1
    bcmath 处理这个问题, 然后这个不是 php 的问题,都有这个问题,Google 一下 浮点数陷阱
    msg7086
    msg7086
    Mar 2, 2021 via Android
    2
    因为计算结果是 1889.9999 你 floor 一下当然就把 0.9999 干掉了。
    markgor
    markgor
    Mar 2, 2021
    3
    你看似有穷的小数, 在计算机的二进制表示里却是无穷的

    var_dump((1890/100*100) == 1890);//<====false
    var_dump(1890/100*100);//float
    var_dump(1890);//int

    你可以把他们转为 2 进制,再转回 10 进制看过程
    weirdo
    weirdo
    Mar 2, 2021
    4
    浏览器打开 console
    输入 1890/100*100 回车
    zagreb
    zagreb
    Mar 2, 2021
    5
    是不是要这样取整?
    floor(x - 0.5) + 1
    zagreb
    zagreb
    Mar 2, 2021
    6
    @zagreb
    哦。有 round() 函数。
    JJstyle
    JJstyle
    Mar 2, 2021
    7
    “为什么 1890 / 100 * 100 结果为正确值 1890” 就不对

    > 1890/100 * 100
    > 1889.9999999999998
    Phariel
    Phariel
    Mar 2, 2021 via iPhone
    8
    IEEE 754 好好学习一下
    dongisking
    dongisking
    Mar 2, 2021
    9
    这个是精度损失的问题,必须用 bcmath 。
    https://www.cnblogs.com/datang6777/p/7049159.html
    wh1012023498
    wh1012023498
    Mar 2, 2021
    10
    IEEE754 标准, 遵循这个标准的都有这个问题。
    Hardrain
    Hardrain
    Mar 6, 2021
    12
    google
    IEEE 754 precision
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2881 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 64ms · UTC 10:56 · PVG 18:56 · LAX 02:56 · JFK 05:56
    ♥ Do have faith in what you're doing.