错误使用(int)和(双)一起切断小数(Error With Using (int) and (do

2019-07-20 07:53发布

当我使用(INT)与(双)有时它不工作正确。
看看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
?>

我需要离开在第二位小数和削减其他没有四舍五入。

Answer 1:

由于浮点精度(例如,见这个问题: PHP -浮动号码精密 ), 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


Answer 2:

这并不回答,为什么出现这种情况(这可能是一个错误的精度)的问题,但解决您的问题,请尝试使用$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。



Answer 3:

首先,PHP是允许您将语言类型的骗局 。 这意味着你不需要(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命令格式化你的号码,你怎么想。

更多在这里



Answer 4:

千万不要投一个未知的分数为整数,请参阅手册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;



Answer 5:

固定。

  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 />"; ?> 


文章来源: Error With Using (int) and (double) together to Cut off Decimals