php楼层精度不正确

时间:2018-04-13 10:48:22

标签: php

我想砍掉我的浮点数,我发现php doc。首先,我希望我的值始终为10000,所以我的函数将会这样做。

function floorDec($value = 0, $decimals = 2) {
        $c = pow(10, $decimals);

        $a1 = $value / 10000;

        printf("a1: %lf, type: %s\n", $a1, gettype($a1));

        $a2 = $a1 * $c;

        printf("a2: %lf, type: %s\n", $a2, gettype($a2));

        $a3 = floor($a2);

        printf("a3: %lf, type: %s\n", $a3, gettype($a3));

        $a4 = $a3 / $c;

        printf("a4: %lf, type: %s\n", $a4, gettype($a4));

        return $a4;
}

$a =  96684700;

var_dump(floorDec($a, 2));

结果

a1: 9668.470000, type: double
a2: 966847.000000, type: double
a3: 966846.000000, type: double
a4: 9668.460000, type: double
float(9668.46)

变量$a3不是我想要的。我不知道为什么。谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

PHP表现正常。这只是浮点数表现方式的副作用 它们有时只是有点不准确:

printf("%.99f", $a2);

打印

  

966846.99999999988358467817306518554687500000000000000000000

当然,如果你floor()认为它是966846。

也许(int)round($a2);可以满足您的需求:

  

966847.00000000000000000000000000000000000000000000000000000

如果您需要绝对精度到一定的小数点,请查看以下函数:https://secure.php.net/manual/en/ref.bc.php