mam ten numer:Jak Number_format() nie do zaokrąglania liczb w górę
$double = '21.188624';
Po użyciu number_format($double, 2, ',', ' ')
uzyskać:
21,19
Ale co chcę jest:
21,18
Jakieś pomysły, jak mogę to wykonać?
Dziękuję.
mam ten numer:Jak Number_format() nie do zaokrąglania liczb w górę
$double = '21.188624';
Po użyciu number_format($double, 2, ',', ' ')
uzyskać:
21,19
Ale co chcę jest:
21,18
Jakieś pomysły, jak mogę to wykonać?
Dziękuję.
number_format
będzie zawsze, że jedynym rozwiązaniem jest go karmić coś innego:
$number = intval(($number*100))/100;
czyli
$number = floor(($number*100))/100;
floor($double*100)/100
użyć tej funkcji:
function number_format_unlimited_precision($number,$decimal = '.')
{
$broken_number = explode($decimal,$number);
return number_format($broken_number[0]).$decimal.$broken_number[1]);
}
masz dodatkowe) $ broken_number [1]); – ddjikic
To nic nie robi: po prostu zwraca ten sam numer wejściowy, jaki został przekazany (również występuje błędne przyporządkowanie nawiasów). – T30
Wiem, że to stara odpowiedź i nie jest to naprawdę dobra odpowiedź, ale wyjaśnijmy, że istnieje zmiana, a jeśli spojrzeć na historię, dodatkowy wspornik został dodany przez tego kolegę Linusa, a nie przez oryginalnego korespondenta. –
$finalCommishParts = explode('.',$commission);
$commisshSuffix = (isset($finalCommishParts[1])?substr($finalCommishParts[1],0,2):'00');
$finalCommish = $finalCommishParts[0].'.'.$commisshSuffix;
Proszę dodać tekst wyjaśniający. Nie widzę "number_format (...)" w tej odpowiedzi, więc jest poza mną, jak to odpowiada na pytanie "Jak zrobić number_format(), aby nie zaokrąglać numerów w górę" – Sumurai8
Ten fragment robi to, co robi numer_format, ale bez zaokrąglanie numeru. Jak wspomniano powyżej, sprawdź lokalny separator dziesiętny. –
public function numberFormatPrecision($number, $separator = '.', $format = 2){
$response = '';
$brokenNumber = explode($separator, $number);
$response = $brokenNumber[0] . $separator;
$brokenBackNumber = str_split($brokenNumber[1]);
if($format < count($brokenBackNumber)){
for($i = 1; $i <= $format; $i++)
$response .= $brokenBackNumber[$i];
}
return $response;
}
Nie możesz mieć ($ i = 1; ... ponieważ $ brokenBackNumber [$ i] będzie wtedy brakowało pierwszego znaku - ponieważ $ brokenBackNumber ma wartość zero.Musisz także mieć sekcję "else {}" dla swojego zdania if Ale podoba mi się twój pomysł –
Jeśli nie dbam o to, co przychodzi za przecinkiem, można rzucić float
jako int
aby uniknąć zaokrągleń:
$float = 2.8;
echo (int) $float; // outputs '2'
używam tej funkcji:
function cutNum($num, $precision = 2){
return floor($num).substr($num-floor($num),1,$precision+1);
}
floor($num)
to część całkowita, a $num-floor($num)
to liczba dziesiętna (jak 0,2345).
Więc substr($num-floor($num),1,$precision+1)
dostaje ".23" (zauważ, że punkt jest również brany).
przykłady wykorzystania:
cutNum(1.2345) //returns 1.23
cutNum(1.2345,3) //returns 1.234
cutNum(1.2345,10) //returns 1.2345
cutNum(1.2345,0) //returns 1. (!don't use with zero as second argument: use floor instead!)
Użyłem go dzisiaj i zadziałało jak czar – samouray
Uratowałeś mi czas Dzięki –
**Number without round**
$double = '21.188624';
echo intval($double).'.'.substr(end(explode('.',$double)),0,2);
**Output** 21.18
Wiem, że to stare pytanie, ale to wciąż rzeczywisty :).
Co z tą funkcją?
function numberFormatPrecision($number, $precision = 2, $separator = '.')
{
$numberParts = explode($separator, $number);
$response = $numberParts[0];
if(count($numberParts)>1){
$response .= $separator;
$response .= substr($numberParts[1], 0, $precision);
}
return $response;
}
Zastosowanie:
// numbers test
numberFormatPrecision(19, 2, '.'); // expected 19 return 19
numberFormatPrecision(19.1, 2, '.'); //expected 19.1 return 19.1
numberFormatPrecision(19.123456, 2, '.'); //expected 19.12 return 19.12
// negative numbers test
numberFormatPrecision(-19, 2, '.'); // expected -19 return -19
numberFormatPrecision(-19.1, 2, '.'); //expected -19.1 return -19.1
numberFormatPrecision(-19.123456, 2, '.'); //expected -19.12 return -19.12
// precision test
numberFormatPrecision(-19.123456, 4, '.'); //expected -19.1234 return -19.1234
// separator test
numberFormatPrecision('-19,123456', 3, ','); //expected -19,123 return -19,123 -- comma separator
w przypadku gdy masz małe float
wartości można użyć number_format
funkcję w ten sposób.
$number = 21.23;
echo number_format($number, 2, '.', ',')); // 21.23
W przypadku gdy masz masz długie liczbę dziesiętną wtedy też będzie format numeru tędy
$number = 201541.23;
echo number_format($number, 2, '.', ',')); // 201,541.23
Użyj natywna funkcja bcdiv.
function numberFormat($number, $decimals = 2, $sep = ".", $k = ","){
$number = bcdiv($number, 1, $decimals); // Truncate decimals without rounding
return number_format($number, $decimals, $sep, $k); // Format the number
}
Aby uzyskać więcej informacji, zobacz this answer.
Wypróbuj za pomocą tego numeru: 0.29, a to się nie powiedzie! – Arsham
zrób to: $ finalCommishParts = explode ('.', $ Commission); $ commisshSuffix = (isset ($ finalCommishParts [1])? Substr ($ finalCommishParts [1], 0,2): '00'); $ finalCommish = $ finalCommishParts [0]. '.'. $ CommisshSuffix; –
@AsafMaoz: uważaj na różnice w separatorach dziesiętnych z ustawieniami regionalnymi. – Wrikken