1. Въведение
В този урок ще разгледаме различните начини за преобразуване на двойна стойност в низ , премахвайки десетичните му знаци.
Ще разгледаме как да го направим, когато искаме просто да отсечем десетичната част и когато искаме да я закръглим.
2. Съкращаване с помощта на кастинг
Ако нашата двойна стойност е в рамките на int , можем да я прехвърлим на int . Актьорският състав съкращава десетичната част, което означава, че я отрязва, без да прави закръгляване.
Този подход е около 10 пъти по-бърз от другите подходи, които ще разгледаме.
След като е int, тогава можем да го предадем на метода valueOf в класа String :
String truncated = String.valueOf((int) doubleValue);
Можем уверено да използваме този подход, когато сме гарантирани, че двойната стойност е в обхвата на int . Но ако стойността ни надвишава това, кастингът няма да работи както бихме искали .
3. Закръгляване с помощта на String.format ()
Сега останалите подходи не са толкова ограничени, колкото кастинг, но те имат свои собствени нюанси.
Например, друг подход е да се използва методът на форматиране на класа String . Първият параметър на метода указва, че форматираме стойност с плаваща запетая с нула цифри след десетичната запетая:
String rounded = String.format("%.0f", doubleValue);
Методът на форматиране използва закръгляване HALF_UP, което ще се закръгли, ако стойността след дробната част е .5 или по-висока. В противен случай връща числото преди десетичната запетая.
И макар да е прост, String.format е най-бавният начин да направите това .
4. Използване на NumberFormat.format ()
Класът NumberFormat също осигурява метод на формат , подобен на класа String , но NumberFormat е по-бърз и с него можем да зададем режима на закръгляване, за да постигнем или съкращаване, или закръгляване.
Методът setMaximumFractionDigits () казва на форматиращия колко дробни цифри след десетичната запетая да включи в изхода:
NumberFormat nf = NumberFormat.getNumberInstance(); nf.setMaximumFractionDigits(0); String rounded = nf.format(doubleValue);
Любопитното е, че NumberFormat не използва HALF_UP по подразбиране. Вместо това използва HALF_EVEN закръгляне по подразбиране, което означава, че ще се закръгли като нормално, с изключение на .5, в който случай ще избере най-близкото четно число .
Въпреки че HALF_EVEN е полезен при статистическия анализ, нека използваме HALF_UP, за да бъдем последователни:
nf.setRoundingMode(RoundingMode.HALF_UP); String rounded = nf.format(doubleValue);
И можем да променим това и да постигнем съкращаване, като настроим форматиращия да използва вместо това режим на закръгляване FLOOR :
nf.setRoundingMode(RoundingMode.FLOOR); String truncated = nf.format(doubleValue)
И сега, той ще отсече, вместо да закръгли.
5. Използване на DecimalFormat.format ()
Подобно на NumberFormat , класът DecimalFormat може да се използва за форматиране на двойни стойности. Въпреки това, вместо да задаваме изходния формат с извиквания на методи, можем да кажем на форматиращия какъв изход искаме, като предоставим на конструктора специфичен модел:
DecimalFormat df = new DecimalFormat("#,###"); df.setRoundingMode(RoundingMode.HALF_UP); String rounded = df.format(doubleValue);
Шаблонът "#, ###" означава, че искаме форматиращият да върне само целочислената част от входа. Също така сигнализира, че искаме цифрите да са групирани в тройки, разделени със запетая.
Тук важат същите настройки по подразбиране за закръгляване, така че ако искаме да изведем пресечена стойност, можем да зададем режима на закръгляване на FLOOR :
df.setRoundingMode(RoundingMode.FLOOR); String truncated = df.format(doubleValue)
6. Използване на BigDecimal.toString ()
Последният подход, който ще разгледаме, е BigDecimal , който ще включим, защото той изпълнява NumberFormat и DecimalFormat за по-големи двойни s .
Можем да използваме метода setScale на BigDecimal, за да разберем дали искаме да закръглим или отсечем:
double largeDouble = 345_345_345_345.56; BigDecimal big = new BigDecimal(largeDouble); big = big.setScale(0, RoundingMode.HALF_UP);
Не забравяйте, че BigDecimal s са неизменни, така че, подобно на Strings, трябва да нулираме стойността.
И след това, ние просто се обадете BigDecimal е ToString :
String rounded = big.toString();
7. Заключение
В този урок разгледахме различните начини, по които можем да преобразуваме двойно в низ, докато премахваме десетични знаци. Предоставихме подходи, които да извеждат или закръглени, или пресечени стойности.
Както обикновено, пробите и еталоните са налични в GitHub.