V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
UnrealEngine
V2EX  ›  PHP

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

  •  
  •   UnrealEngine · 2021-03-02 12:50:27 +08:00 · 2515 次点击
    这是一个创建于 1367 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    > 1890/100 * 100
    > 1889.9999999999998
    Phariel
        8
    Phariel  
       2021-03-02 15:27:04 +08:00 via iPhone
    IEEE 754 好好学习一下
    dongisking
        9
    dongisking  
       2021-03-02 15:29:52 +08:00
    这个是精度损失的问题,必须用 bcmath 。
    https://www.cnblogs.com/datang6777/p/7049159.html
    wh1012023498
        10
    wh1012023498  
       2021-03-02 22:01:45 +08:00
    IEEE754 标准, 遵循这个标准的都有这个问题。
    sorshion
        11
    sorshion  
       2021-03-02 22:27:28 +08:00
    Hardrain
        12
    Hardrain  
       2021-03-06 20:00:21 +08:00
    google
    IEEE 754 precision
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4992 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 03:55 · PVG 11:55 · LAX 19:55 · JFK 22:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.