意外行为PHP浮动为int转换

时间:2019-07-06 21:47:31

标签: php floating-point int

enter image description here

如果您执行var_dump((799-639.20)* 100/799);它将给出float(20)作为结果。如果我进行转换,我得到19。有人可以解释一下这里可能会发生什么吗?

1 个答案:

答案 0 :(得分:4)

我无法说出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。