我知道 php 浮点数有对应的计算函数,但是上面这个例子还是不知道原因
![]() | 1 justseemore 2021-03-02 12:53:22 +08:00 bcmath 处理这个问题, 然后这个不是 php 的问题,都有这个问题,Google 一下 浮点数陷阱 |
![]() | 2 msg7086 2021-03-02 12:54:09 +08:00 via Android 因为计算结果是 1889.9999 你 floor 一下当然就把 0.9999 干掉了。 |
![]() | 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 进制看过程 |
4 weirdo 2021-03-02 14:15:21 +08:00 浏览器打开 console 输入 1890/100*100 回车 |
5 zagreb 2021-03-02 14:47:24 +08:00 是不是要这样取整? floor(x - 0.5) + 1 |
![]() | 7 JJstyle 2021-03-02 14:54:04 +08:00 “为什么 1890 / 100 * 100 结果为正确值 1890” 就不对 > 1890/100 * 100 > 1889.9999999999998 |
![]() | 8 Phariel 2021-03-02 15:27:04 +08:00 via iPhone IEEE 754 好好学习一下 |
9 dongisking 2021-03-02 15:29:52 +08:00 这个是精度损失的问题,必须用 bcmath 。 https://www.cnblogs.com/datang6777/p/7049159.html |
![]() | 10 wh1012023498 2021-03-02 22:01:45 +08:00 IEEE754 标准, 遵循这个标准的都有这个问题。 |
![]() | 11 sorshion 2021-03-02 22:27:28 +08:00 |
![]() | 12 Hardrain 2021-03-06 20:00:21 +08:00 google IEEE 754 precision |