这可能是一个愚蠢的问题,但我一次又一次地搜索而没有找到任何结果。
所以,我想要的是显示一个数字的所有小数位,而不知道它将有多少小数位。看看这个小代码:
$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中是否有一个设置来确定小数位数? 非常感谢你提前! (并随时询问您是否还有其他问题)
答案 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内是正确的就足够了。显然,您可以将此条件更改为适合您遇到的数字 - 您甚至可以将其作为函数的可选参数。
玩它 - 如果不清楚则提出问题。