3
个数字,那么:
1 -> 1.00
10 -> 10.0
100 -> 100
1000 -> 1000 // don't lop off any numbers, as they're all significant
我以为我可以通过以下方式做到这一点:
number_format($n, max(0,$digits-strlen((string)intval($n))), null, '')
适用于上述所有情况,但99.99
失败(给100.0
代替100
)。
所以我不太清楚如何做到这一点。计算小数位前的位数将无效,因为它可能在舍入后发生变化。
N.B。当我说“数字”时,我的意思是在小数点后的和之前的总位数。另请注意,这与“有效数字”并不完全相同,因为我将“1000”计为“4位数”,即“1位有效数字”和“0位小数位”。
答案 0 :(得分:1)
尝试以下
number_format($n, max(0,$digits-strlen((string) ( (strlen(str_replace('.','',(string)$n))<=$digits) ? intval($n) : (max(round($n),intval($n))) ))), null, '');
php > $n=1;
php > print number_format($n, max(0,$digits-strlen((string) ( (strlen(str_replace('.','',(string)$n))<=$digits) ? intval($n) : (max(round($n),intval($n))) ))), null, '');
1.00
php > $n=10;
php > print number_format($n, max(0,$digits-strlen((string) ( (strlen(str_replace('.','',(string)$n))<=$digits) ? intval($n) : (max(round($n),intval($n))) ))), null, '');
10.0
php > $n=100;
php > print number_format($n, max(0,$digits-strlen((string) ( (strlen(str_replace('.','',(string)$n))<=$digits) ? intval($n) : (max(round($n),intval($n))) ))), null, '');
100
php > $n=1000;
php > print number_format($n, max(0,$digits-strlen((string) ( (strlen(str_replace('.','',(string)$n))<=$digits) ? intval($n) : (max(round($n),intval($n))) ))), null, '');
1000
php > $n=99.99;
php > print number_format($n, max(0,$digits-strlen((string) ( (strlen(str_replace('.','',(string)$n))<=$digits) ? intval($n) : (max(round($n),intval($n))) ))), null, '');
100
php > $n=99.9;
php > print number_format($n, max(0,$digits-strlen((string) ( (strlen(str_replace('.','',(string)$n))<=$digits) ? intval($n) : (max(round($n),intval($n))) ))), null, '');
99.9
答案 1 :(得分:0)
function _whole_digit_count($n) {
return strlen(abs((int)$n));
}
function _does_round_up($n, $d) {
return _whole_digit_count(number_format($n, $d, null, '')) > _whole_digit_count($n);
}
function round_digits($size, $digits=3) {
$wd = _whole_digit_count($size);
$decimals = $digits - $wd;
if($decimals > 0) {
if(_does_round_up($size, $decimals)) {
--$decimals;
}
}
return number_format($size, $decimals, null, '')
}
基本上,我们在这里使用number_format
来进行舍入并添加0,但我们首先必须计算出我们想要的小数位数。我们通过减去小数点左边的位数来做到这一点。
然而,这可能导致四舍五入,使得另一个数字被添加到整数。在这种情况下,我们必须减去额外的小数位。