【问题标题】:how to prevent float variables displaying as scientific notation when printing [duplicate]打印时如何防止浮点变量显示为科学计数法
【发布时间】:2020-12-29 22:30:12
【问题描述】:

我使用 "(float)$val" 进行一些计算,但对于一些十进制值,例如 -0.00000025478625 (float)-0.00000025478625 结果为 -2.5479E-70, 我需要与-0.00000025478625相同的值,而不影响其他场景。 如何防止这种转换?

【问题讨论】:

  • 您是否担心因为它在打印时会这样做?
  • 那不是hex value,那是浮点数的科学记数法。浮子就是浮子。
  • echo sprintf('%17.15f',$var);
  • 只有在您知道有固定的小数位数限制时才能执行此操作。否则它的准确性永远无法指望。
  • 浮点不是函数:)。它应该是(浮点数)-0.00000025478625

标签: php floating-point type-conversion precision


【解决方案1】:

我认为您误解了浮动的表示。 -2.5479E-70 的值实际上仍然是科学表示的浮点值。

这实际上意味着您的值非常小,因此出于可读性原因,它以这种格式表示。要阅读它,您可以将E 替换为以下数字的10 次方-2.5479 * 10^(-70)。所以这意味着你的浮点数前面有 70 个零(我不会在这里写下来)。

例如,-5.47E-4 将是 -5.47 * 10^(-4),这与 -5.47/10000 相同导致 -0.000547

此外,对于打印,您的值已四舍五入。在内部,它仍然使用确切的值。因此,如果您在进一步评估中使用此数字,您不会失去任何准确性。

【讨论】:

    【解决方案2】:

    这是浮点数的科学记数法。所以,如果你想格式化,那么你应该使用 number_format() 函数。 下面的示例第二个参数将告诉您需要什么精度。 因此,根据您的示例,您应该使用 14。

    试试这个:

    $var = number_format((float)-0.00000025478625, 14);
    print($var);
    

    【讨论】:

      【解决方案3】:

      要添加到Manish's answer

      请注意,PHP 中的floating point numberslimited precision

      例如:

      <?php
      
      echo number_format((float) 0.0000000000000000000000004, 50);
      

      甚至

      <?php
      
      echo sprintf('%f15.50', (float) 0.0000000000000000000000004);
      

      你会得到这样的东西(取决于系统):

      0.00000000000000000000000040000000000000001539794790
      

      这不是要打印的原始浮点数。

      你永远不能指望浮点数的准确性。处理它们的最佳方法是始终将它们存储为字符串,直到您需要完成一些计算。

      【讨论】:

        猜你喜欢
        • 2010-10-14
        • 1970-01-01
        • 2020-06-10
        • 1970-01-01
        • 2012-12-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多