当我使用(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
?>
我需要在数字中留下两位小数,并在没有四舍五入的情况下剪切其他小数。
答案 0 :(得分: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
答案 1 :(得分:1)
这并没有回答为什么会发生这种情况的问题(这可能是一个精确的错误),但要解决您的问题,请尝试使用$foo = sprintf("%.2f", (float)$str);
。
示例:
$str = "158.2";
$num = (double)$str;
print sprintf("%.2f", $num);
编辑:事实上,是的,这是一个精确的问题。 (在C ++中)通过打印158.2到20位小数,我得到“158.19999999999998863132”的输出。这是浮点/双精度值的固有问题。您可以在PHP中使用echo sprintf("%.20f", $var);
来查看相同的效果。
答案 2 :(得分:1)
首先,PHP是一种允许您type juggle的语言。这意味着您不需要(int)
或(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
命令根据需要设置数字格式。
更多here
答案 3 :(得分:0)
永远不要将未知分数转换为整数,请参阅http://www.php.net/manual/en/language.types.integer.php上的手册。
(int) ( (0.1+0.7) * 10 );
将导致7,而不是人们所期望的8。从float到integer的转换将始终向下舍入 - 您可能还想检查运算符优先级http://php.net/manual/en/language.operators.precedence.php。
解决方案:在投射前计算你的分数。 $fStr = (float) $str; $iStr = (int) $fStr;
答案 4 :(得分: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 />";
?>