浮点数 1 有时转换为整数为 0,有时转换为 1


Float 1 converts to integer sometimes as 0, sometimes as 1

我试图通过减去整数部分,将余数乘以 10,然后将结果转换为 int 或使用 intval() 来获取浮点数的第一个小数位作为整数。我注意到 x.1 的数字的结果正确为 1 作为浮点数,但在将其转换为整数后,它有时变为 0,有时变为 1。

我试图用 1.1 到 9.1 的数字来测试它:

for ($number = 1; $number < 10; $number++) {
    $result = 10 * ($number + 0.1 - $number);
    echo "<br/> number = " . ($number + 0.1) . ", result: ";
    var_dump($result);
    $result_int = intval($result);
    var_dump($result_int);
}

从 4.1 作为输入开始,1 奇怪地转换为 0:

number = 1.1, result: float(1) int(1)
number = 2.1, result: float(1) int(1)
number = 3.1, result: float(1) int(1)
number = 4.1, result: float(1) int(0)
number = 5.1, result: float(1) int(0)
number = 6.1, result: float(1) int(0)
number = 7.1, result: float(1) int(0)
number = 8.1, result: float(1) int(0)
number = 9.1, result: float(1) int(0)  

为什么是 4.1?这对我来说没有任何意义。谁能给我一个提示,我做错了什么?

PS:也在 http://ideone.com/hr7M0A

您看到这些结果是因为浮点运算并不完全准确。

不要尝试手动获取第一个小数点,请使用fmod

$result = substr(fmod($number, 1) * 10, 0, 1)

我的 php 有点生疏,所以我的语法可能关闭了,但转换为字符串并取最右边的数字不应该更简单吗?

sprintf($Str, "%.1f", $number);
$digit=$Str[strlen($Str)-1]; // Last digit