【问题标题】:PHP - Summing an array of decimal valuesPHP - 对一组十进制值求和
【发布时间】:2009-06-22 19:09:02
【问题描述】:

我正在尝试在 PHP 中计算十进制值数组的总和,但由于某种原因它一直四舍五入为整数。

例如:

$oldArray = array(0.00,1000.11,988.92,978.22,964.01,953.07,948.82,917.26,902.56,913.21,904.08,898.86,892.79);
$myVar = 0.0;
for($k=1;$k<10;$k++)
{
$myVar += $oldArray[$k];
}
print_r($myVar);

$oldArray 实际上是用 SQL 查询中的十进制值填充的($oldarray 的长度大约是几百,但我想要前 10 个。 在上面的例子中,我期望 $myVar 是一个小数,但结果只是一个整数。我尝试在 for 循环之前设置 $myVar = 0.0000,我尝试了 $myVar += $oldArray[$k] + 0.0000 等,但似乎没有任何效果。

我做错了什么?如何将 $myVar 显式设置为小数?

【问题讨论】:

  • 您是否将变量的精度设置在某个可能会影响这一点的地方?
  • PHP 数组是基于 0 的。对于($k=0...)。此外,您应该将 $myVar 初始化为高于 for 循环的 0.00。
  • 我不想要第零个词。我确实初始化了它,从 0.0 到 0.0000。而且不知道有没有地方可以设置变量的精度。

标签: php floating-point decimal sum


【解决方案1】:

鉴于这似乎无法重现,对我来说这听起来像是您的 PHP 环境本身的问题。

检查 php.ini 中名为“precision”的设置,并确保将其设置为默认的 14 位有效数字。我无法想象为什么会改变这一点,但它肯定会产生影响。

【讨论】:

  • 是的,我试过 ini_set("precision", 14);现在效果很好。谢谢!
  • 酷 :) 你肯定也想找出问题的根源,所以你不必再处理它>_
【解决方案2】:

您可以尝试改用array_sum() 并使用 (float) 来转换值。此外,我会确保数组中的值格式正确(1.45 而不是 1,45)。 HTH。

更新

顺便说一句。您可以使用“is_float()”来检查数组中的每个参数。

【讨论】:

  • 我不能使用 array_sum() 因为我只想要数组一部分的总和。无论如何我都试过了,它仍然给出了整数。
  • 你可以使用 arry_sum(array_slice($oldArray,1,10)) 得到 oldArray 的前 10 个元素的总和(不包括第 0 个元素)
【解决方案3】:

无法重现。

php > $oldArray = array(0, .1, .2, .3, .4, .5, .6, .7, .8, .9);                                                    
php > $myVar = 0.0;
php > for($k=0;$k < count($oldArray);$k++)
php > {
php { $myVar += $oldArray[$k];
php { }
php > print_r($myVar);
4.5

编辑:我尝试了您评论中的代码,没关系。和 AlbertoPL 一样,我怀疑问题出在其他地方。

php > $oldArray = array(0.01,1000.11,988.92,978.22,964.01,953.07,948.82,917.26,902.56,913.21,904.08,898.86,892.79);
php > $myVar = 0.0000;
php > for($k=1;$k<10;$k++)
php >   $myVar += $oldArray[$k];
php > print_r($myVar);
8566.18

【讨论】:

  • $oldArray = array(0.01,1000.11,988.92,978.22,964.01,953.07,948.82,917.26,902.56,913.21,904.08,898.86,892.79); $myVar = 0.0000; for($k=1;$k
  • 也在 PHP 控制台中运行,得到 8566.18 =/
【解决方案4】:

制作你自己的实现:

function sum_array($arr){
 $count = 0;
  foreach ($arr as $val){
    if (!is_numeric($val) // neglect any non numeric values
      {
        $error = true;
        continue;
      }
      else{
        $count = $count + ($val*1); //casting to numeric if the value supplied as string
      }
  }
  return $count
}

echo sum_array($myArray);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-02
    • 2015-05-24
    • 2017-08-20
    • 2023-03-22
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多