我有各种各样的长号,并且我试图编写一个函数来正确格式化它们。有人可以帮我吗?
我已经尝试过“ number_format()
”和“ round()
”,但这不能解决我的问题。
我想将其舍入为以下内容:
1024.43 --> 1,024.43
0.000000931540 --> 0.000000932
0.003991 --> 0.00399
0.3241 --> 0.324
1045.3491 --> 1,045.35
因此,如果数字大于“ 0”,则应四舍五入到小数点后两位,并添加千位分隔符(如6,554.24);如果数字小于“ 1”,则当数字出现在零后时,应四舍五入至3位数字。 (例如0.0003219至0.000322或0.2319至0.232)
编辑: “-”值应相同。例如:
-1024.43 --> -1,024.43
-0.000000931540 --> -0.000000932
-0.003991 --> -0.00399
-0.3241 --> -0.324
-1045.3491 --> -1,045.35
答案 0 :(得分:1)
适应https://stackoverflow.com/a/48283297/2469308
尝试以下操作:
function customRound($value)
{
if ($value > -1 && $value < 1) {
// define the number of significant digits needed
$digits = 3;
if ($value >= 0) {
// calculate the number of decimal places to round to
$decimalPlaces = $digits - floor(log10($value)) - 1;
} else {
$decimalPlaces = $digits - floor(log10($value * -1)) - 1;
}
// return the rounded value
return number_format($value, $decimalPlaces);
} else {
// simply use number_format function to show upto 2 decimal places
return number_format($value, 2);
}
// for the rest of the cases - return the number simply
return $value;
}
答案 1 :(得分:0)
$x = 123.456;
echo number_format($x, max(2, 3 - ceil(log10(abs($x))))) . "\n";
$x = 1.23456;
echo number_format($x, max(2, 3 - ceil(log10(abs($x))))) . "\n";
$x = 0.0123456;
echo number_format($x, max(2, 3 - ceil(log10(abs($x))))) . "\n";
$x = 0.0000123456;
echo number_format($x, max(2, 3 - ceil(log10(abs($x))))) . "\n";
$x = 0.000000123456;
echo number_format($x, max(2, 3 - ceil(log10(abs($x))))) . "\n";
$x = 0.00000000123456;
echo number_format($x, max(2, 3 - ceil(log10(abs($x))))) . "\n";
输出:
123.45
1.23
0.0123
0.0000123
0.000000123
0.00000000123
基本上,这始终保留最少2个小数位,最多保留3个有效位。
但是,由于内部处理浮点的方式(为2的幂而不是10的幂),因此存在一些陷阱。像0.1
和0.001
之类的数字无法精确存储,因此它们实际上存储为0.09999999...
或类似的东西。在这种情况下,似乎计算错了,并为您提供了比有效位数更多的答案。
您可以尝试通过允许公式的误差范围来抵消这种现象:
number_format($x, max(2, 3 - ceil(log10(abs($x))) - 1e-8))
但这可能会导致其他不良影响。您将必须进行测试。