PHP如何显示所有小数位?

时间:2014-02-17 23:00:13

标签: php decimal number-formatting

这可能是一个愚蠢的问题,但我一次又一次地搜索而没有找到任何结果。

所以,我想要的是显示一个数字的所有小数位,而不知道它将有多少小数位。看看这个小代码:

$arrayTest = array(0.123456789, 0.0123456789);

foreach($arrayTest as $output){
    $newNumber = $output/1000;
    echo $newNumber;
    echo "<br>";
}

它给出了这个输出:

0.000123456789
1.23456789E-5

现在,我尝试使用'number_format',但我不认为这是一个很好的解决方案。它确定了精确的小数位数,我不知道每个数字的小数位数。看看下面的代码:

$arrayTest = array(0.123456789, 0.0123456789);

foreach($arrayTest as $output){
    $newNumber = $output/1000;
    echo number_format($newNumber,13);
    echo "<br>";
}

它给出了这个输出:

0.0001234567890
0.0000123456789

现在,正如您所看到的,第一个数字中有一个超出0,因为number_format强制它有13个小数位。

我真的很喜欢如何解决这个问题。 PHP.ini中是否有一个设置来确定小数位数? 非常感谢你提前! (并随时询问您是否还有其他问题)

1 个答案:

答案 0 :(得分:3)

正确回答这个问题是“不可能的” - 因为十进制数的二进制浮点表示是近似的:"What every computer scientist should know about floating point"

你最接近的就是给自己写一个例程,它看一个数字的十进制表示,并将它与“确切”值进行比较;一旦差异变得“足够小以达到您的目的”,您就会停止添加更多数字。

此例程可以将“正确的位数”作为字符串返回。

示例:

<?php
$a = 1.234567890;
$b = 0.123456789;
echo returnString($a)."\n";
echo returnString($b)."\n";

function returnString($a) {
// return the value $a as a string
// with enough digits to be "accurate" - that is, the value returned
// matches the value given to 1E-10
// there is a limit of 10 digits to cope with unexpected inputs
// and prevent an infinite loop

  $conv_a = 0;
  $digits=0;

  while(abs($a - $conv_a) > 1e-10) {
    $digits = $digits + 1;
    $conv_a = 0 + number_format($a, $digits);
    if($digits > 10) $conv_a = $a;
  }

  return $conv_a;

}

?>

哪个产生

1.23456789
0.123456789

在上面的代码中,我任意地假设在1E-10内是正确的就足够了。显然,您可以将此条件更改为适合您遇到的数字 - 您甚至可以将其作为函数的可选参数。

玩它 - 如果不清楚则提出问题。