【问题标题】:PHP Find the first scientificly significant 'non zero' digits of an floating numberPHP 查找浮点数的第一个具有科学意义的“非零”数字
【发布时间】:2017-04-27 22:34:03
【问题描述】:

在这个问题中,我在科学背景下使用了显着这个词

我想检索浮点数左侧的前 n 位数字。该函数应包含:

  • $number,浮点数。

  • $n 是要检索的数字数量。

以下是我希望函数返回的一些示例输入和输出:

  • 当 $number= 5678 且 $n=2 then -> 结果应该是:56
  • 当 $number= -69869 和 $n=4 then -> 结果应该是:6986
  • 当 $number= 0.00676 和 $n=2 then -> 结果应该是:67
  • 当 $number= -0.0000048 和 $n= 3 时 ->result 应该是:480

我尝试了一些数学函数来实现这一点,并取得了相当大的进展,但最后一个给出了问题

$result = (int)(abs($number)/pow(10,(int)(log10(abs($number)))-$n));

它返回 479 作为答案。这是因为我正在使用浮点数,但我不知道如何解决这个问题。有人吗?

【问题讨论】:

    标签: php math floating-point


    【解决方案1】:

    你可以用字符串来做。这是一个选项吗?

    $result = (int)str_pad(substr((int)str_replace('.','',preg_replace('/E‌​(.*)/','',abs($numbe‌​r))),0,$n),$n,'0',ST‌​R_PAD_RIGHT);
    

    【讨论】:

    • 对不起,没有。在最后一个示例中它将返回 0。因为 substr(str_replace('.','',abs($number)),0,$n);将返回 48E。 E 会导致错误。
    • 它适用于所有经过测试的 PHP 版本。您使用的是哪个版本?是一般情况下没有选择还是仅仅因为这个问题?
    • 应该是substr((int)str_replace('.','',abs($number)) 而不是substr(str_replace('.','',abs($number))。在我的回答中是正确的!
    • 我正在运行最新的 xampp,所以它是 PHP 5.6.30。但我不认为这是问题所在。当仅存在 2 个有效数字并且在它们前面有超过 7 个或 8 个零(作为最理想的)时,在字符串中生成 E。因为整个字符串将类似于 48E-8,其中 E 代表 10 的幂-8
    • (int)cast 将删除 E-stuff
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    相关资源
    最近更新 更多