【问题标题】:Unexpected behavior PHP float to int conversion意外行为 PHP float 到 int 转换
【发布时间】:2019-11-16 23:07:32
【问题描述】:
如果你这样做 var_dump((799-639.20)*100/799);它会给出 float(20) 作为结果。如果我进行 int 转换,我得到 19。有人可以解释这里可能发生的情况吗?
【问题讨论】:
-
-
请注意浮点数是二进制数据结构。当你 var_dump() 他们时,你会得到一个透明的有损转换,以 precision 指令确定的位数为基数 10。
标签:
php
floating-point
int
【解决方案1】:
我无法说出 PHP 的官方语义,但很有可能:
- 由于使用了 IEEE-754 基本 64 位二进制浮点数,
(799-639.20)*100/799) 的计算结果为 19.999999999999996447286321199499070644378662109375。
-
var_dump 显示的输出未显示完整值;它四舍五入到有限的位数并显示“20”。例如,它实际上可以使用 16 位有效数字在内部格式化数字,这会产生“20.00000000000000”,然后删除尾随无意义的零和尾随“.”,从而产生“20”。
-
(int)(799-639.20)*100/799) 的计算首先产生 19.999999999999996447286321199499070644378662109375,然后将其转换为 int,它被截断,产生 19。