【问题标题】:PHP how to use range() for float numbersPHP如何将range()用于浮点数
【发布时间】:2021-11-13 00:39:14
【问题描述】:

有没有办法将 PHP range() 用于非常小的数字?像下面这样?

range(0.54,0.58);

这样做会产生错误。

range(): step 超出了in的指定范围

【问题讨论】:

  • 你想要什么??
  • 范围函数默认步长为1,所以报错了。
  • 让我先添加另一个答案,结果相同!

标签: php


【解决方案1】:

第三个参数是step
阅读documentation 是一个很好的起点。

如果您阅读,您会发现您可以将步长设置为可以在您的限制之间增加的值。
错误消息只是告诉您它不能在不超过 0.58 的情况下将 0.54 增加 1 - 想想看,它 1 + 0.54 大于 0.58!

改用这一行将为您提供所需的输出。

range(0.54, 0.58, 0.01);

【讨论】:

    【解决方案2】:

    错误信息一目了然:$rangerange() 的第三个参数)的默认值是1,使用它会产生一个空范围。

    range() 提供第三个参数。从$start$end 的值来看,我认为0.01 是您需要的步骤:

    range(0.54, 0.58, 0.01)
    

    查看:https://3v4l.org/IcUAh

    【讨论】:

    • 感谢您指出这一点,所以我错过了函数的增量属性。
    【解决方案3】:

    你还应该提供你想要的范围。

    这样

    var_dump(range(0.54,0.58,0.01));

    输出是

    array(4) {
      [0]=>
      float(0.54)
      [1]=>
      float(0.55)
      [2]=>
      float(0.56)
      [3]=>
      float(0.57)
    }
    

    【讨论】:

      【解决方案4】:

      使用第三个参数设置步长

      范围(0.54,0.58, 0.01);

      或者你可以将你的值乘以 1000,然后除以 1000,这很愚蠢......

      【讨论】:

        【解决方案5】:

        这里的其他答案对我不起作用,因为浮点数的舍入误差,结果不准确:

        • 根据开始和结束编号,结果是包含还是不包含结束编号。
        • 此外,在 PHP 8 中,舍入误差在结果中是可见的。 (接缝only apply to debug output。)

        示例:

        php 7.4:(包含与独占)

        php > var_dump(range(0.54, 0.6, 0.01));  
        array(6) {
          [0]=>
          float(0.54)
          [1]=>
          float(0.55)
          [2]=>
          float(0.56)
          [3]=>
          float(0.57)
          [4]=>
          float(0.58)
          [5]=>
          float(0.59)
        }
        php > var_dump(range(0.52, 0.6, 0.01)); 
        array(9) {
          [0]=>
          float(0.52)
          [1]=>
          float(0.53)
          [2]=>
          float(0.54)
          [3]=>
          float(0.55)
          [4]=>
          float(0.56)
          [5]=>
          float(0.57)
          [6]=>
          float(0.58)
          [7]=>
          float(0.59)
          [8]=>
          float(0.6)
        }
        

        php 8.0:(包含与排除 + 舍入误差)

        php > var_dump(range(0.54, 0.6, 0.01));
        array(6) {
          [0]=>
          float(0.54)
          [1]=>
          float(0.55)
          [2]=>
          float(0.56)
          [3]=>
          float(0.5700000000000001)
          [4]=>
          float(0.5800000000000001)
          [5]=>
          float(0.5900000000000001)
        }
        php > var_dump(range(0.52, 0.6, 0.01));
        array(9) {
          [0]=>
          float(0.52)
          [1]=>
          float(0.53)
          [2]=>
          float(0.54)
          [3]=>
          float(0.55)
          [4]=>
          float(0.56)
          [5]=>
          float(0.5700000000000001)
          [6]=>
          float(0.5800000000000001)
          [7]=>
          float(0.5900000000000001)
          [8]=>
          float(0.6)
        }
        

        解决方案:

        这确实给出了我的预期结果(PHP 7.4 及更高版本):

        php > var_dump(array_map(fn($n) => $n/100, range(0.54*100, 0.6*100,  0.01*100)));
        array(7) {
          [0]=>
          float(0.54)
          [1]=>
          float(0.55)
          [2]=>
          float(0.56)
          [3]=>
          float(0.57)
          [4]=>
          float(0.58)
          [5]=>
          float(0.59)
          [6]=>
          float(0.6)
        }
        

        【讨论】:

          猜你喜欢
          • 2016-03-10
          • 2022-12-19
          • 1970-01-01
          • 2011-02-26
          • 2012-09-06
          • 2017-07-07
          • 2021-12-19
          • 1970-01-01
          • 2011-06-07
          相关资源
          最近更新 更多