【问题标题】: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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多