【问题标题】:Always round up on first decimal总是在小数点后四舍五入
【发布时间】:2016-09-07 21:50:14
【问题描述】:

我希望我的变量的第一个小数总是四舍五入。例如:

9.66 goes to 9.7
9.55 goes to 9.6
9.51 goes to 9.6
9.00000001 goes to 9.1

我该怎么做?

【问题讨论】:

标签: php rounding


【解决方案1】:

round() 与可选的精度和圆形参数一起使用,例如:

round($value, 1, PHP_ROUND_HALF_UP)

round() 的可选第二个参数是精度参数,它指定要舍入到的小数位数。第三个可选参数指定舍入模式。详情请见PHP manual for round

使用round() 并不总是四舍五入向上,即使使用 PHP_ROUND_HALF_UP(例如,9.00001 不四舍五入为 9.1)。您可以尝试使用乘法、ceil() 和除法:

ceil($value * 10.0) / 10.0

由于这些是浮点值,您可能无法得到准确的结果。

【讨论】:

  • 我已经使用了四舍五入,但是当第三个(或更多)小数小于 5 时,它总是向下舍入。我还研究了精度参数,但找不到任何有用的东西。
  • 我认为它不能完全按照指定的方式工作。 echo '9.00000001 => '.round(9.00000001, 1, PHP_ROUND_HALF_UP).PHP_EOL; 失败,我的输出是 9。
  • This question 也可能对您有所帮助,但我(再次)编辑了我的答案,为您的问题提供了一个简单的替代解决方案。
  • 嗯,效果很好。数字 9.0000001 就是一个例子,但这个数字可能永远不会出现。谢谢!
【解决方案2】:

我做了几个测试,并通过测试用例提出以下答案

<?php

echo '9.66 (expected 9.7) => '.myRound(9.66).PHP_EOL;
echo '9.55 (expected 9.6) => '.myRound(9.55).PHP_EOL;
echo '9.51 (expected 9.6) => '.myRound(9.51).PHP_EOL;
echo '9.00000001 (expected 9.1) => '.myRound(9.00000001).PHP_EOL;
echo '9.9 (expected ??) => '.myRound(9.9).PHP_EOL;
echo '9.91 (expected ??) => '.myRound(9.91).PHP_EOL;

function myRound($value)
{
    return ceil($value*10)/10;
}

【讨论】:

  • 这里的问题是 9.91 的结果应该是什么?我认为应该是 10。
【解决方案3】:

我不是 php 程序员,所以必须在“步骤”中回答。您遇到的问题是极端情况,您的数字恰好只有一位小数。 (例如 9.5)

你可以这样做:

  1. 将您的数字乘以 10。
  2. 如果是整数,则返回原始数字(这是边缘情况),否则继续如下:
  3. 加0.5
  4. 以正常方式将其四舍五入为整数(即​​“a.5”向上四舍五入)。
  5. 将结果除以 10。

对于第 (2) 步,浏览 php 文档会发现一个函数 bool is_int ( mixed $var ) 用于测试整数。

【讨论】:

    【解决方案4】:

    您将需要一个自定义的 ceil() 函数,默认函数或回合无法满足您的要求。

    【讨论】:

      【解决方案5】:

      使用这个:online test

      您可以使用这种技术。只需分解给定的数字/字符串,得到. 的下一个值/数字的数字。得到这个之后,您需要增加该值并检查该值是否大于 9 或 nor,如果然后将其相除并将进位添加到主数的第一部分。

      $var = '9.96';
      $ar = explode(".", $var);
      
      $nxt = substr($ar[1], 0, 1) + 1;
      
      if($nxt > 9){
          $tmp = (string) $nxt;
          $num = floatval(($ar[0] + $tmp[0]).".".$tmp[1]);
      }   
      else
          $num = floatval($ar[0].".".$nxt);
      
      var_dump($num); // float(10)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多