【问题标题】:calculations on floating number nowhere near correct浮点数的计算几乎不正确
【发布时间】:2017-09-30 02:00:52
【问题描述】:

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

直接正确吗?显然不是根据 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)

任何想法为什么会发生这种情况。我什至确保信息是明确的浮点数或整数。

谢谢

【问题讨论】:

    标签: php floating-point int


    【解决方案1】:

    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));
    

    【讨论】:

    • 谢谢,考虑到是 php 将它们放在那里开始,我没有想到逗号不会读取。
    猜你喜欢
    • 2017-06-08
    • 2021-05-28
    • 2019-08-08
    • 1970-01-01
    • 2022-01-22
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    相关资源
    最近更新 更多