2009-08-20 7 views
9

Jak zapobiec String.format("%.2f", doubleValue); zaokrąglania (algorytm zaokrąglania do połowy) zamiast po prostu go obcinać?Zapobiegaj zaokrągleniu w String.format ("%. 2f", doubleValue) w Javie

np.

doubleValue = 123.459 

po formatowaniu,

doubleValue = 123.46 

Chcę po prostu wyrzucić ostatnią cyfrę,

123.45 

Wiem, że są inne sposoby, aby to zrobić, po prostu chcę wiedzieć, czy to jest możliwe przy użyciu String.format.

Odpowiedz

12

Zawsze można ustawić tryb zaokrągleń:

http://java.sun.com/javase/6/docs/api/java/math/RoundingMode.html

a następnie użyć String.Format() HALF_EVEN jest używany domyślnie, ale można go zmienić do sufitu

inne nie będzie tak elastyczne podejście (ale nie o to pytałeś):

DecimalFormat df = new DecimalFormat("###.##"); 
df.format(123.459); 
+0

Co powinieneś zrobić, jeśli cyfry po lewej stronie przecinka dziesiętnego mogą zawierać więcej niż 3 cyfry? Czy możliwe jest użycie go bezpośrednio na podwójnej zmiennej, która przekształci go w ciąg znaków, zamiast tworzyć nowy obiekt? –

+1

Przyszłe odniesienie to jest złe. Jeśli decymalne wartości są mniejsze niż 6, wówczas używana jest okrągła połowa do góry, stosuje się inne mądre zaokrąglenie HALF_EVEN. Uważam to za absurd! – Chad

3
doubleValue = 123.459 
doubleValue = Math.ceil(doubleValue*100)/100; 
+3

Jeśli chcesz obciąć, nie chcesz używać 'floor' dla wartości dodatnich i' ceil' do negatywnych ? – Rob

5

Wygląda na to, że odpowiedź brzmi: NIE MA ZNACZENIA. http://java.sun.com/javase/6/docs/api/java/util/Formatter.html#dndec „to wartość zostanie zaokrąglona za pomocą algorytmu round pół up”

Uważam to za dziwne, że robią to, ponieważ NumberFormatter pozwala ustawić RoundingMode. Ale jak mówisz, istnieją inne sposoby, aby to zrobić. Oczywiście najłatwiej jest odjąć .005 od wartości pierwszej.

+1

To powinna być zaakceptowana odpowiedź. @ DimitryK's odpowiedzi oznacza, że ​​można uzyskać String.format(), aby obciąć zamiast rundy, co jest nieprawdziwe. – Aranda

-1

użycie string.Format ("% 2f." DoubleValue - 0,005)

+4

Zachowaj ostrożność przy takim podejściu !. 'String.format ("% .2f ", 1.05 - .005)' daje "1.04", prawdopodobnie z powodu niedokładności zmiennoprzecinkowych. – Aranda