浮点数的计算无法接近正确

时间:2017-05-02 13:52:21

标签: php floating-point int

我有一个脚本可以在一段时间内分期付款。

直接正确吗?显然不是根据php。

这是发布的表单信息,我知道这是发布的内容,因为我是var_dump()所有发布值,以确保发布的内容。

array
    'total' => string string '999,999.99' (length=10)
    'howmany' => string '16,666.67' (length=9)
    'installmentcost1' => string '999,999.99' (length=10)

这是非常简单的php公式

$tempInstallments = (intval($_POST['howmany'])) - 1; // get 1 less so we can make sure the last payment is within total amount
$tempInstallmentCost = (floatval($_POST['installmentcost1'])) * $tempInstallments; //installment price * the installment period minus 1 month
$tempTotal = floatval($_POST['cpototal']) - $tempInstallmentCost; // get the final payment cost

现在不幸的是,由于某种原因,这给了我一些非常糟糕的数学,我也是var_dump()。

这是我正在使用的var_dump:

var_dump($tempInstallments);
var_dump($_POST['installmentcost1']);
var_dump($tempInstallmentCost);
var_dump($tempTotal);

以下是倾销的内容:

int 59
string '16,666.67' (length=9)
float 944
float 55

正如您所看到的,它们甚至不接近所需的实际信息。

例如,它看起来如下所示:

int 59
string '16,666.67' (length=9)
float 983,333.53 (length=10)
float 16,666.46 (length=9)

任何想法为什么会这样。我甚至确保信息是一个确定的浮点数或int。

由于

1 个答案:

答案 0 :(得分:3)

intval()floatval()不处理标点符号,因此intval("1,234.56")1。您可以改为使用filter_var()

$s = '1,234.56';
var_dump(filter_var($s, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));

这会产生:

string(7) "1234.56"

如果需要,您可以intval()floatval()。或者只是删除逗号:

$s = '1,234.56';
$s = str_replace(',', '', $s);
var_dump(floatval($s));