5

当我将 (int) 与 (double) 一起使用时,有时它无法正常工作。
查看 PHP 代码示例:

我需要留下 2 个小数并删除其他...

我知道 number_format(); 功能但我不能使用它。因为它是四舍五入的数字

number_format(24.299,2);
输出:24.30
我需要:24.29

<?php

$str="158.2";

echo (double)$str; // Output: 158.2
echo (double)$str*100; // Output: 15820
echo (int)((double)$str*100); // Output: 15819 <-WHY? It Must To Be 15820, Why 15819? 
echo ((int)((double)$str*100)/100); // Output: 158.19
?>

我需要在数字中保留两位小数,并在不四舍五入的情况下减少其他小数。

4

5 回答 5

5

由于浮点精度(例如,参见这个问题:PHP - Floating Number Precision),158.2 * 100完全是 15820,而是类似于15819.99999999.

现在(int)是用于类型转换,而不是用于舍入,并且该点之后的任何数字都被切掉。

我需要在数字中保留两位小数,并在不四舍五入的情况下减少其他小数。

这很简单:

number_format($str, 2);

更新

number_format 圆,所以它有点复杂:

bcmul($str,100,0)/100

bcmul以任意精度相乘,在本例中为 0。结果:

bcmul(158.2,100,0)/100 == 158.2
bcmul(24.299,100,0)/100 == 24.29
于 2013-02-21T15:57:44.313 回答
1

这不能回答为什么会发生这种情况的问题(它可能是一个精确错误),但要解决您的问题,请尝试使用$foo = sprintf("%.2f", (float)$str);.

例子:

$str = "158.2";
$num = (double)$str;
print sprintf("%.2f", $num);

编辑:事实上,是的,这是一个精度问题。(在 C++ 中)通过打印 158.2 到 20 个小数位,我得到“158.19999999999998863132”的输出。这是浮点/双精度值的固有问题。echo sprintf("%.20f", $var);在 PHP 中使用也可以看到同样的效果。

于 2013-02-21T15:47:19.697 回答
1

首先,PHP 是一种允许您键入 juggle的语言。这意味着您不需要 the(int)或 the(double)来做您想做的事情。

<?php
$str="158.2"; //could also do $str = 158.2
echo $str; // Ouput: 158.2
echo $str * 100; //Output: 15820
echo number_format($str, 2); //Output: 158.20
echo number_format(($str*100)/100, 2); //Output: 158.20
?>

使用该number_format命令以您想要的方式格式化您的数字。

更多在这里

于 2013-02-21T15:47:50.563 回答
0

切勿将未知分数转换为整数,请参阅http://www.php.net/manual/en/language.types.integer.php上的手册。 (int) ( (0.1+0.7) * 10 );将导致 7,而不是预期的 8。从浮点数转换为整数将始终向下舍入 - 您可能还想检查运算符优先级http://php.net/manual/en/language.operators.precedence.php

解决方案:在你投之前计算你的分数。$fStr = (float) $str; $iStr = (int) $fStr;

于 2013-02-21T15:55:38.423 回答
0

固定的。

    function cutDecimals($number,$decimal){
        $_str=(string)$number;
        if(strpos($_str,".")!==false){
            $dotPosition=strpos($_str,".")+1;
            $_numCount=strpos($_str,".");
            $_decimal=strlen($_str)-$dotPosition;

            if($_decimal<$decimal) return (double)$_str;
            else return (double)substr($_str,0,$_numCount+$decimal+1);
        }else return (double)$_str;
    }

    echo cutDecimals("158.099909865",2)."<br />";
    echo cutDecimals("14.02",2)."<br />";
    echo cutDecimals("41.12566",2)."<br />";
    echo cutDecimals("1.981",2)."<br />";
    echo cutDecimals("0.4111",2)."<br />";
    echo cutDecimals("144.2",2)."<br />";
    echo cutDecimals("55.000000",2)."<br />";
    echo cutDecimals("1456115.499811445121",2)."<br />";

?>
于 2013-02-21T15:57:21.083 回答