답변:
이 스레드 에서 이를 수행하는 여러 가지 방법이 있습니다.
double r = 5.1234;
System.out.println(r); // r is 5.1234
int decimalPlaces = 2;
BigDecimal bd = new BigDecimal(r);
// setScale is immutable
bd = bd.setScale(decimalPlaces, BigDecimal.ROUND_HALF_UP);
r = bd.doubleValue();
System.out.println(r); // r is 5.12
f = (float) (Math.round(n*100.0f)/100.0f);
DecimalFormat df2 = new DecimalFormat( "#,###,###,##0.00" );
double dd = 100.2397;
double dd2dec = new Double(df2.format(dd)).doubleValue();
// The value of dd2dec will be 100.24
DecimalFormat는, () 를 할 수있는 가장 역동적 인 방법이 될 것 같다, 그리고 다른 사람의 코드를 읽을 때 이해하기 매우 쉽게이기도합니다.
당신 String.format()
은 새로운 가장 친한 친구가 될 것입니다!
https://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html#syntax
String.format("%.2f", (double)value);
String.format
숫자가 아닌 문자열을 형식화하기위한 것입니다.
DecimalFormat
. 그리고 DecimalFormat
빨리보다 약간이다 String.format
. 단순 System.currentTimeMillis
비교는 그것을 보여줍니다.
NumberFormat (및 대부분의 다른 Format 하위 항목)의 하위 클래스는 동기화되지 않습니다. 형식 개체를 만들고 util 클래스의 정적 변수에 저장하는 것은 일반적이지만 위험한 방법입니다. 실제로는 상당한 부하가 발생할 때까지 거의 항상 작동합니다.
네, 반올림합니다. 이것이 주요 예제 소스 입니다.
/*
* Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of Sun Microsystems nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
import java.util.*;
import java.text.*;
public class DecimalFormatDemo {
static public void customFormat(String pattern, double value ) {
DecimalFormat myFormatter = new DecimalFormat(pattern);
String output = myFormatter.format(value);
System.out.println(value + " " + pattern + " " + output);
}
static public void localizedFormat(String pattern, double value, Locale loc ) {
NumberFormat nf = NumberFormat.getNumberInstance(loc);
DecimalFormat df = (DecimalFormat)nf;
df.applyPattern(pattern);
String output = df.format(value);
System.out.println(pattern + " " + output + " " + loc.toString());
}
static public void main(String[] args) {
customFormat("###,###.###", 123456.789);
customFormat("###.##", 123456.789);
customFormat("000000.000", 123.78);
customFormat("$###,###.###", 12345.67);
customFormat("\u00a5###,###.###", 12345.67);
Locale currentLocale = new Locale("en", "US");
DecimalFormatSymbols unusualSymbols = new DecimalFormatSymbols(currentLocale);
unusualSymbols.setDecimalSeparator('|');
unusualSymbols.setGroupingSeparator('^');
String strange = "#,##0.###";
DecimalFormat weirdFormatter = new DecimalFormat(strange, unusualSymbols);
weirdFormatter.setGroupingSize(4);
String bizarre = weirdFormatter.format(12345.678);
System.out.println(bizarre);
Locale[] locales = {
new Locale("en", "US"),
new Locale("de", "DE"),
new Locale("fr", "FR")
};
for (int i = 0; i < locales.length; i++) {
localizedFormat("###,###.###", 123456.789, locales[i]);
}
}
}
DecimalFormat을 사용하십시오 .
표준 라이브러리에는 두 가지 접근 방식이 있습니다. 하나는 java.text.DecimalFormat을 사용하는 것입니다. java.util.Formatter를 기반으로하는 다른 더 비밀스러운 메서드 (String.format, PrintStream.printf 등)는 C 프로그래머를 행복하게 유지해야합니다 (ish).
Robert가 그의 답변에서 지적했듯이 DecimalFormat은 동기화되지 않았고 API가 스레드 안전성을 보장하지도 않습니다 (사용중인 JVM 버전 / 공급 업체에 따라 달라질 수 있음).
대신 스레드로부터 안전한 Spring의 Numberformatter 를 사용하십시오 .
public static void formatDouble(double myDouble){
NumberFormat numberFormatter = new DecimalFormat("##.000");
String result = numberFormatter.format(myDouble);
System.out.println(result);
}
예를 들어 formatDouble () 메서드에 전달 된 double 값이 345.9372이면 결과는 다음과 같습니다. 345.937 마찬가지로 값 .7697이 메서드에 전달되면 결과는 .770입니다.
Double.valueOf
는new Double(number).doubleValue()
. 마지막 예제의 마지막 행은 그 때문에 것double dd2dec = Double.valueOf(df2.format(dd));