【问题标题】:What would be the best way to detect if a float has a zero fraction value (e.g. 125.00) in PHP?在 PHP 中检测浮点数是否具有零分数值(例如 125.00)的最佳方法是什么?
【发布时间】:2018-05-12 18:29:07
【问题描述】:

看,我想写一个函数,它接受一个浮点数参数并将浮点数四舍五入到最接近的货币值(带两位小数的浮点数),但如果浮点数参数的分数为零(即后面全为零小数位)然后它将浮点数作为整数返回(或者即截断小数部分,因为无论如何它们都是零。)。

但是,我发现我无法弄清楚如何确定分数是否为零。我不知道是否有一个 PHP 函数已经这样做了。我看过。我能想到的最好的方法是先将浮点数转换为整数,然后从浮点数中减去整数部分,然后检查差值是否为零。

【问题讨论】:

  • 非常感谢你们的回答。我很感激,我希望我能给出不止一个最佳/公认的答案,但可惜,它违背了最高级的目的。

标签: php function math


【解决方案1】:
if($value == round($value))
{
    //no decimal, go ahead and truncate.
}

此示例将值与自身进行比较,四舍五入到小数点后 0 位。如果四舍五入的值与该值相同,则您没有小数部分。简单明了。

【讨论】:

  • 这是老派,在 Commodore BASIC 上学到了这一点。猜猜谁是古人? :)
【解决方案2】:

PHP 类型杂耍能力的小技巧

if ($a == (int) $a) {
    // $a has a zero fraction value
}

【讨论】:

  • 比起round(),我更喜欢这个。 :)
【解决方案3】:

我认为最好的方法:

if ((string)$value == (int)$value){
    ...
}

例子:

$value = 2.22 * 100;
var_dump($value == (int)$value); // false - WRONG!
var_dump($value == round($value)); // false - WRONG!
var_dump((string)$value == (int)$value); // true - OK!

【讨论】:

    【解决方案4】:
    function whatyouneed($number) {
        $decimals = 2;
        printf("%.".($number == (int)($number) ? '0' : $decimals)."F", $number);
    }
    

    所以基本上它要么是printf("%.2F"),如果你想要2个小数,或者printf("%.2F"),如果你不想要。

    【讨论】:

      【解决方案5】:

      嗯,问题是浮点数不准确。 Read here 如果您有兴趣找出原因。我要做的是确定准确性水平,例如小数点后 3 位,并以此为基础。为此,您将其乘以 1000,将其转换为 int,然后检查 $your_number % 1000==0 是否。

      $mynumber = round($mynumber *1000);
      if ($mynumber % 1000==0)
      { isInt() }
      

      【讨论】:

        【解决方案6】:

        您知道,您不必编写一个函数来做到这一点,已经存在一个:

        $roundedFloat = (float)number_format("1234.1264", 2, ".", ""); // 1234.13
        

        如果你想保留尾随的.00,只需省略浮点转换(虽然它会返回一个字符串):

        $roundedFloatStr = number_format("1234.000", 2, ".", ""); // 1234.00
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-03-28
          • 2021-08-05
          • 2011-04-13
          • 1970-01-01
          • 2011-05-25
          相关资源
          最近更新 更多