【发布时间】:2013-08-24 01:41:18
【问题描述】:
我试图理解在 PHP 中从 float 转换为 int,并遇到以下代码:
echo (int) ( (0.1+0.7) * 10 ); // echoes 7!
我的问题是为什么它回显 7 而不是 8?其背后的逻辑是什么?
【问题讨论】:
标签: php
我试图理解在 PHP 中从 float 转换为 int,并遇到以下代码:
echo (int) ( (0.1+0.7) * 10 ); // echoes 7!
我的问题是为什么它回显 7 而不是 8?其背后的逻辑是什么?
【问题讨论】:
标签: php
这里:
$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。
因为存储在内存中的实际值类似于 7.999999999999999999999999 这是由舍入误差引起的。
【讨论】:
你也可以使用intval()
$float = 7.99999999999999999999999999999999;
$int = intval($float);
echo $int;
【讨论】: