【问题标题】:What's the best way to get the fractional part of a float in PHP?在 PHP 中获取浮点数的小数部分的最佳方法是什么?
【发布时间】:2008-09-08 21:59:23
【问题描述】:

如何在 PHP 中找到浮点数的小数部分?

例如,如果我有值1.25,我想返回0.25

【问题讨论】:

    标签: php


    【解决方案1】:
    $x = $x - floor($x)
    

    【讨论】:

    • 当你处理像 = 0.25 这样的浮点数时,这将不起作用
    • @primo:将您的评论放入答案中,您应该为此提高声誉! :)
    • 作为对已接受答案的评论,它更有可能被看到,因此更有用。
    • $a= fmod(1.01,1)*100;回声$a;回声 PHP_EOL; $rounded= fmod($a,1);回声 $rounded; 1 8.8817841970013E-16 对我来说很奇怪
    【解决方案2】:
    $x = fmod($x, 1);
    

    这是一个演示:

    <?php
    $x = 25.3333;
    $x = fmod($x, 1);
    var_dump($x);
    

    应该输出

    double(0.3333)
    

    Credit.

    【讨论】:

    • 可能是最好的答案,因为不需要两次使用该值,因此需要存储。为确保号码上没有任何符号,请用abs() 包裹,所以它是:abs(fmod($x, 1))
    【解决方案3】:

    不要忘记,您不能相信浮点运算是 100% 准确的。如果您对此感到担忧,则需要查看BCMath Arbitrary Precision Mathematics 函数。

    $x = 22.732423423423432;
    $x = bcsub(abs($x),floor(abs($x)),20);
    

    你也可以自己破解字符串

    $x = 22.732423423423432;    
    $x = strstr ( $x, '.' );
    

    【讨论】:

    • 在像 10000000000000.00011111 这样的数字中它不起作用:(
    【解决方案4】:

    如果数字是负数,你必须这样做:

     $x = abs($x) - floor(abs($x));
    

    【讨论】:

      【解决方案5】:

      nlucaroni 提供的答案仅适用于正数。适用于正数和负数的可能解决方案是:

      $x = $x - intval($x)
      

      【讨论】:

      • 请注意:类型转换为 (int) 会更快
      【解决方案6】:

      我的PHP技能欠缺,但你可以从原来的数字中减去一个地板的结果

      【讨论】:

        【解决方案7】:

        但是,如果您正在处理诸如 perlin 噪声或其他图形表示之类的问题,则被接受的解决方案是正确的。它将为您提供较低数字的小数部分。

        即:

        • .25 : 0 以下为整数,小数部分为 .25
        • -.25 : -1 是下面的整数,小数部分是 .75

        对于其他解决方案,您将在下面将 0 重复为整数,更糟糕的是,您将得到所有负数的反转小数值。

        【讨论】:

          【解决方案8】:

          前面的一些答案是片面的。我相信,这是您处理所有情况所需要的:

          function getDecimalPart($floatNum) {
              return abs($floatNum - intval($floatNum));
          }
          
          $decimalPart = getDecimalPart($floatNum);
          

          【讨论】:

            【解决方案9】:

            你可以使用fmod函数:

            $y = fmod($x, 1); //$x = 1.25 $y = 0.25
            

            【讨论】:

              【解决方案10】:

              为了避免这个页面上的混乱,实际上这是最好的答案,它速度很快,并且适用于 $x 的正值和负值:

              $frac=($x<0) ? $x-ceil($x) : $x-floor($x);
              

              我在 PHP 7.2.15 上运行了 1000 万次计算的速度测试,尽管两种解决方案给出了相同的结果,但 fmod 比 floor/ceil 慢。

              $frac=($x&lt;0) ? $x-ceil($x) : $x-floor($x); -> 490-510 毫秒(取决于 $x 的符号)

              $frac=fmod($x, 1); -> 590 - 1000 毫秒(取决于 $x 的值)

              而实际的空循环本身需要 80 毫秒(包括在上述时间中)。

              测试脚本:

              $x=sqrt(2)-0.41421356237;
              
              $time_start = microtime(true);
              for ($i=0;$i<=9999999;$i++) {
                  //$frac=fmod($x, 1); // version a
                  $frac=($x<0) ? $x-ceil($x) : $x-floor($x); // version b
              }
              $time_end = microtime(true);
              
              $time = $time_end - $time_start;
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-08-05
                • 1970-01-01
                • 2010-09-12
                • 2018-08-28
                • 2017-03-28
                相关资源
                最近更新 更多