【问题标题】:converting from float to Int in php [duplicate]在php中从float转换为Int [重复]
【发布时间】:2013-08-24 01:41:18
【问题描述】:

我试图理解在 PHP 中从 float 转换为 int,并遇到以下代码:

echo (int) ( (0.1+0.7) * 10 ); // echoes 7!

我的问题是为什么它回显 7 而不是 8?其背后的逻辑是什么?

【问题讨论】:

    标签: php


    【解决方案1】:

    这里:

    $var = (int) $othervar;
    

    我猜:

    $var = int($othervar);
    

    也可以。但事实并非如此!

    gettype() 会告诉你类型,get_class() 会告诉你一个对象的类,两者都返回字符串,get_class() 如果没有提供参数或 null,则返回当前类,如果你提供非对象get_class() 这是某种错误。

    这些函数是 php 有多糟糕的一个例子,gettype()get_class(),有趣的事实,因为你必须玩“猜猜哪个有下划线”你也有 is_a()(函数,期望 $var 和"typename") 和instanceof(运算符)。

    而是:

    $var = intval($othervar);
    

    还有floatval,他们后面都有val!更多的 PHP 愚蠢。

    注意:

    $var = (string) $othervar;
    

    调用$othervar's __toString() 方法,但没有__toInt() 方法,只有字符串。

    希望这会有所帮助。

    附录:

    整数总是被截断,因此是 7。

    其他附录:

    如果您想要更可控的转换,您可以使用 round(),它可以按预期工作,floor()(向下舍入,因此 7 少 x 8 层减少到 7,-3 减少 x 减少 2 层到 -3 ) 和 ceil() 向上取整(减少 7 x 减少 8 ceils 到 8,减少 -3 x 减少 -2 ceils 到 -2)

    这个问题与以下内容几乎完全相同:

    Why would on earth PHP convert the result of (int) ((0.1+0.7)*10) to 7, not 8?

    即使是例子!

    【讨论】:

    • 这个答案唯一相关的部分是addendums
    • 但是整个答案很有用,我曾经认为 PHP 是自从未切片面包过时以来最好的东西,它涵盖了简单的转换、缺少强制转换函数、奇怪的 intval 形式,“整数是总是被截断”,然后是三个舍入函数,这是一个完整的,如果它有 40 页长,我当然会修剪它,但这不是我所说的“长答案”,我知道这将是主观的但这肯定会落在任何人的“不长”方面。
    • 不过,实际回答问题的部分不应该在你关于 php 怪异的咆哮结束时被标记。
    • 也许,我最初误读了这个问题,我阅读了标题和第一句话并开始输入我的答案,我选择插入一个附录,而不是仅仅把它放在我的答案中,因为它被添加了提交后,您认为重新构建答案是否值得?鉴于有多少重复的问题,甚至值得这个评论部分吗?无论如何,是的,我采取了懒惰的方式,但如果他们阅读的话,给任何搜索的人一个完整的答案。如果你想让我编辑我会的,我在这里比你新,所以我会听从你的建议。
    • 在我看来,如果你写了一个答案,你应该总是努力让它尽可能地做到最好,并且把直接回答他们问题的部分放在第一位会有所帮助,之后你绝对可以留下其余的不过。
    【解决方案2】:

    因为存储在内存中的实际值类似于 7.999999999999999999999999 这是由舍入误差引起的。

    【讨论】:

      【解决方案3】:

      你也可以使用intval()

      $float = 7.99999999999999999999999999999999;
      $int = intval($float);
      
      echo $int;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-11
        • 1970-01-01
        • 1970-01-01
        • 2013-07-05
        相关资源
        最近更新 更多