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

2021-03-02 12:50:27 +08:00
 UnrealEngine

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

2544 次点击
所在节点    PHP
12 条回复
zpfhbyx
2021-03-02 12:53:22 +08:00
bcmath 处理这个问题, 然后这个不是 php 的问题,都有这个问题,Google 一下 浮点数陷阱
msg7086
2021-03-02 12:54:09 +08:00
因为计算结果是 1889.9999 你 floor 一下当然就把 0.9999 干掉了。
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
2021-03-02 14:15:21 +08:00
浏览器打开 console
输入 1890/100*100 回车
zagreb
2021-03-02 14:47:24 +08:00
是不是要这样取整?
floor(x - 0.5) + 1
zagreb
2021-03-02 14:48:45 +08:00
@zagreb
哦。有 round() 函数。
JJstyle
2021-03-02 14:54:04 +08:00
“为什么 1890 / 100 * 100 结果为正确值 1890” 就不对

> 1890/100 * 100
> 1889.9999999999998
Phariel
2021-03-02 15:27:04 +08:00
IEEE 754 好好学习一下
dongisking
2021-03-02 15:29:52 +08:00
这个是精度损失的问题,必须用 bcmath 。
https://www.cnblogs.com/datang6777/p/7049159.html
wh1012023498
2021-03-02 22:01:45 +08:00
IEEE754 标准, 遵循这个标准的都有这个问题。
sorshion
2021-03-02 22:27:28 +08:00
Hardrain
2021-03-06 20:00:21 +08:00
google
IEEE 754 precision

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/757590

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX