소수점 이하 두 자리로 반올림
이 질문에는 이미 답변이 있습니다.
- Java 30 답변 에서 소수점 이하 자릿수를 반올림하는 방법
값이 200.3456
인 경우 형식을 지정해야합니다 200.34
. 그렇다면 200
이어야합니다 200.00
.
여기에 유틸리티입니다 그 라운드 (대신 절단 ) 소수점의 지정된 번호로 두 배.
예를 들면 다음과 같습니다.
round(200.3456, 2); // returns 200.35
원본 버전; 이것으로 조심
public static double round(double value, int places) {
if (places < 0) throw new IllegalArgumentException();
long factor = (long) Math.pow(10, places);
value = value * factor;
long tmp = Math.round(value);
return (double) tmp / factor;
}
이는 매우 높은 소수 자릿수 (예 :) 또는 큰 정수 부분 (예 :)이 있는 코너의 경우 심하게 나뉩니다 . 이것을 지적 해준 Sloin 에게 감사합니다 .round(1000.0d, 17)
round(90080070060.1d, 9)
위의 내용을 사용하여 "너무 크지 않은"두 배를 몇 년 동안 행복하게 소수점 2 자리 또는 3 자리로 반올림했습니다 (예 : 로깅 목적으로 초 단위로 시간을 정리하는 경우 : 27.987654321987-> 27.99). 그러나 더 깨끗한 코드로 더 안정적인 방법을 쉽게 사용할 수 있으므로 피하는 것이 가장 좋습니다.
대신 이것을 사용하십시오
( Louis Wasserman 의이 답변 과 Sean Owen 의이 답변 에서 수정되었습니다 .)
public static double round(double value, int places) {
if (places < 0) throw new IllegalArgumentException();
BigDecimal bd = BigDecimal.valueOf(value);
bd = bd.setScale(places, RoundingMode.HALF_UP);
return bd.doubleValue();
}
참고 HALF_UP
반올림 모드 "일반적으로 학교에서 배운"입니다. Bankers 'Rounding 과 같은 다른 것이 필요하다고 생각되면 RoundingMode 설명서를 숙지하십시오 .
물론 원하는 경우 위의 내용을 하나의 라이너로 인라인 할 수 있습니다.
new BigDecimal(value).setScale(places, RoundingMode.HALF_UP).doubleValue()
그리고 모든 경우에
항상 부동 소수점 표현을 사용하는 것을 기억 float
하고 double
있습니다 부정확 . 예를 들어 다음 표현식을 고려하십시오.
999199.1231231235 == 999199.1231231236 // true
1.03 - 0.41 // 0.6200000000000001
정확성을 위해 BigDecimal을 사용하려고합니다 . 그리고 그 동안 String을 취하는 생성자를 사용하십시오. 예를 들어 다음을 실행하십시오.
System.out.println(new BigDecimal(1.03).subtract(new BigDecimal(0.41)));
System.out.println(new BigDecimal("1.03").subtract(new BigDecimal("0.41")));
이 주제에 대한 훌륭한 추가 자료 :
- 항목 48 : "피
float
와double
에 정확한 답변이 필요한 경우" 효과적인 자바 조슈아 블로흐 (2 판) - 부동 소수점 산술에 대해 모든 프로그래머가 알아야 할 사항
숫자를 반올림하는 대신 (또는 그에 더하여) 문자열 형식 을 원하면 다른 답변을 참조하십시오.
특히을 round(200, 0)
반환합니다 200.0
. " 200.00 " 을 출력 하려면 먼저 반올림 한 다음 출력 결과 형식을 지정해야합니다 ( Jessper의 답변 에 완벽하게 설명되어 있음 ).
double
소수점 다음에 두 자리 숫자 로 인쇄 하려면 다음과 같이 사용하십시오.
double value = 200.3456;
System.out.printf("Value: %.2f", value);
String
콘솔에 결과를 인쇄 하는 대신 결과를 얻으려면 String.format()
동일한 인수를 사용하십시오.
String result = String.format("%.2f", value);
또는 수업을 사용하십시오 DecimalFormat
:
DecimalFormat df = new DecimalFormat("####0.00");
System.out.println("Value: " + df.format(value));
나는 이것이 더 쉽다고 생각한다.
double time = 200.3456;
DecimalFormat df = new DecimalFormat("#.##");
time = Double.valueOf(df.format(time));
System.out.println(time); // 200.35
이것은 형식화뿐만 아니라 실제로 반올림을 수행합니다.
가장 쉬운 방법은 다음과 같은 트릭을 수행하는 것입니다.
double val = ....;
val = val*100;
val = Math.round(val);
val = val /100;
val이 200.3456에서 시작하면 20034.56으로 이동하고 20035로 반올림하여 200.34로 나눕니다.
항상 반올림하고 싶다면 항상 int로 캐스팅하여 잘릴 수 있습니다.
double val = ....;
val = val*100;
val = (double)((int) val);
val = val /100;
이 기술은 매우 큰 복식 (양수 또는 음수)의 경우 오버플로 될 수 있기 때문에 대부분의 경우 작동합니다. 그러나 귀하의 가치가 적절한 범위에 있음을 알고 있다면 이것이 효과가 있습니다.
Apache commons math를 사용하십시오 :
Precision.round(10.4567, 2)
function Double round2(Double val) {
return new BigDecimal(val.toString()).setScale(2,RoundingMode.HALF_UP).doubleValue();
}
toString ()에주의하십시오 !!!!
BigDecimal이 double의 정확한 이진 형식을 변환하기 때문입니다 !!!
다음은 다양한 제안 방법과 실패 사례입니다.
// Always Good!
new BigDecimal(val.toString()).setScale(2,RoundingMode.HALF_UP).doubleValue()
Double val = 260.775d; //EXPECTED 260.78
260.77 - WRONG - new BigDecimal(val).setScale(2,RoundingMode.HALF_UP).doubleValue()
Double val = 260.775d; //EXPECTED 260.78
260.77 - TRY AGAIN - Math.round(val * 100.d) / 100.0d
Double val = 256.025d; //EXPECTED 256.03d
256.02 - OOPS - new DecimalFormat("0.00").format(val)
// By default use half even, works if you change mode to half_up
Double val = 256.025d; //EXPECTED 256.03d
256.02 - FAIL - (int)(val * 100 + 0.5) / 100.0;
double value= 200.3456;
DecimalFormat df = new DecimalFormat("0.00");
System.out.println(df.format(value));
double d = 28786.079999999998;
String str = String.format("%1.2f", d);
d = Double.valueOf(str);
실제로 동일한 더블을 원하지만 원하는 방식으로 반올림하면 BigDecimal을 사용할 수 있습니다.
new BigDecimal(myValue).setScale(2, RoundingMode.HALF_UP).doubleValue();
더블을 반올림하는 것은 일반적으로 원하는 것이 아닙니다. 대신 String.format()
원하는 형식으로 표현하십시오.
두 개의 반올림 숫자. 매우 간단하며 DecimalFormat이 수행하는 표시 목적 대신 기본적으로 변수를 업데이트하고 있습니다.
x = Math.floor(x * 100) / 100;
value = (int)(value * 100 + 0.5) / 100.0;
귀하의 질문에 따르면 숫자를 반올림하지 않으려는 것 같습니다. .format ()은 반올림을 사용하여 숫자를 반올림한다고 생각합니다.
반올림하려면 200의 정밀도는 2의 정밀도로 200.35가되어야하지만 귀하의 경우 첫 번째 2를 원하고 나머지는 버려야합니까?
100을 곱한 다음 다시 100으로 나누기 전에 int (또는 수의 바닥을 취)로 캐스팅 할 수 있습니다.
200.3456 * 100 = 20034.56;
(int) 20034.56 = 20034;
20034/100.0 = 200.34;
그럼에도 불구하고 실제로 큰 숫자가 경계에 가까워 질 수 있습니다. 이 경우 문자열로 변환하고 하위 문자열로 변환하면 쉽게 작동합니다.
참고 URL : https://stackoverflow.com/questions/2808535/round-a-double-to-2-decimal-places
'Programming' 카테고리의 다른 글
foreach 색인을 찾는 방법은 무엇입니까? (0) | 2020.02.17 |
---|---|
Android Min SDK 버전과 대상 SDK 버전 (0) | 2020.02.17 |
문자열이 지정된 문자열로 시작하는지 확인하는 방법은 무엇입니까? (0) | 2020.02.17 |
AVFoundation, CaptureStillImageAsynchronouslyFromConnection을 캡처 할 때 셔터 사운드를 끄는 방법은 무엇입니까? (0) | 2020.02.17 |
검색 엔진을 사용하여 특수 문자를 검색하려면 어떻게해야합니까? (0) | 2020.02.17 |