Java에서 소수점 이하 두 자리까지만 두 배로자를 수 있습니까?


97

예를 들어 3.545555555 변수가 있는데 3.54로 자르고 싶습니다.


20
이것은 중복이 아닙니다. 자르기와 반올림은 완전히 다른 두 가지입니다.
markthegrea

동의합니다. 이것이 중복으로 표시된 이유를 모르겠습니다.
Bassinator

답변:


146

표시 목적으로 원하는 경우 다음을 사용하십시오 java.text.DecimalFormat.

 new DecimalFormat("#.##").format(dblVar);

계산에 필요한 경우 다음을 사용하십시오 java.lang.Math.

 Math.floor(value * 100) / 100;

50
이것은 잘린 3.545555555에서 3.54로 표시 되지 않고 3.55로 반올림됩니다. DecimalFormat.setRoundingMode ()는 RoundingMode.FLOOR로 설정되어야합니다.
Christian García 2013 년

9
이것은 나를 위해 작동하지 않습니다. Math.floor (9.62 * 100) / 100은 9.61을 제공합니다
Mani

4
floor자르기를 사용 하는 것은 양수 값에 대해서만 작동합니다.
Dev

4
@ ChristianGarcía 잘림이 제대로 이루어집니다 RoundingMode.DOWNRoudingMode.FLOOR부의 무한대에 가까워 항상 라운드.
Dev

46
DecimalFormat df = new DecimalFormat(fmt);
df.setRoundingMode(RoundingMode.DOWN);
s = df.format(d);

사용 가능한 확인 RoundingModeDecimalFormat.


반올림보다는 잘림을 요구하는 질문을 다루지 않습니다.
Basil Bourque 2015

8
@BasilBourque RoundingMode.DOWN은 잘림입니다. 바닥 함수를 잘못 추천하는 다른 답변과 비교하면 (floor는 양수 만 자름) 양수 및 음수 값 모두에 대해 올바르게 작동합니다.
Dev

1
@Dev 나는 정정 당했다. 나는 그것이 DOWN실제로 양수와 음수 모두에 대해 잘림 효과가 있음을 알았습니다 . 문서의 예제 테이블에서 볼 수 있습니다.
Basil Bourque

24

Bit Old Forum, 위의 답변 중 어느 것도 양수와 음수 값 모두에 대해 작동하지 않았습니다 (나는 계산을 의미하고 반올림하지 않고 자르기를 의미합니다). 로부터 어떻게 자바에서 n 개의 소수 자릿수로 숫자를 반올림하는 링크

private static BigDecimal truncateDecimal(double x,int numberofDecimals)
{
    if ( x > 0) {
        return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_FLOOR);
    } else {
        return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_CEILING);
    }
}

이 방법은 나를 위해 잘 작동했습니다.

System.out.println(truncateDecimal(0, 2));
    System.out.println(truncateDecimal(9.62, 2));
    System.out.println(truncateDecimal(9.621, 2));
    System.out.println(truncateDecimal(9.629, 2));
    System.out.println(truncateDecimal(9.625, 2));
    System.out.println(truncateDecimal(9.999, 2));
    System.out.println(truncateDecimal(-9.999, 2));
    System.out.println(truncateDecimal(-9.0, 2));

결과 :

0.00
9.62
9.62
9.62
9.62
9.99
-9.99
-9.00

이 대답 MOR 확장 이상의 테스트 케이스입니다
ㅋㅋ - 디에고 마토스

return new BigDecimal (x) .setScale (numberofDecimals, RoundingMode.DOWN) .doubleValue ();
Shimon Doodkin

반올림은 당신이 의미하는 것과 같습니다 : docs.oracle.com/javase/7/docs/api/java/math/RoundingMode.html
Shimon Doodkin

9

참고 먼저 그 double진 부분이며, 정말하지 않습니다 소수점을.

당신이 장소를 진수 필요 경우 사용 BigDecimal이있는, setScale()잘라 내기위한 방법 또는 사용 DecimalFormat를 얻을 수를 String.


7

어떤 이유로, 당신이 사용하지 않는 경우, BigDecimal당신은 당신을 캐스팅 할 수 double에은 int을 절단합니다.

Ones 위치 로 자르려면 다음을 수행하십시오 .

  • 단순히 캐스팅 int

받는 사람 소수점 첫째 자리의 장소 :

  • 10을 곱하다
  • 캐스트 int
  • 다시 캐스팅 double
  • 10으로 나눕니다.

Hundreths 플레이스

  • 100으로 곱하고 나눕니다.

예:

static double truncateTo( double unroundedNumber, int decimalPlaces ){
    int truncatedNumberInt = (int)( unroundedNumber * Math.pow( 10, decimalPlaces ) );
    double truncatedNumber = (double)( truncatedNumberInt / Math.pow( 10, decimalPlaces ) );
    return truncatedNumber;
}

이 예에서, decimalPlaces사람은 당신이 가고 싶은 이후 자리의 자릿수가 될 것이다, 그렇게 한 것 라운드에 에바의 장소, 2에 백분 등 (0으로 라운드에 사람의 장소, 그리고 수십 부정적 일 등)


3
이것은 끔찍한 일반적인 해결책입니다. 곱하기와 캐스트는 모두 데이터를 버리고 결과적으로 unroundedNumber충분히 큰 경우 사실상 난수가됩니다 . 질문의 예에서는 작동 할 수 있지만 일반적인 솔루션은 모든 double.
blm

6

문자열로 형식을 지정하고 다시 double로 변환하면 원하는 결과를 얻을 수 있습니다.

double 값은 round (), floor () 또는 ceil ()이 아닙니다.

이에 대한 빠른 수정은 다음과 같습니다.

 String sValue = (String) String.format("%.2f", oldValue);
 Double newValue = Double.parseDouble(sValue);

표시 목적으로 sValue를 사용하거나 계산을 위해 newValue를 사용할 수 있습니다.


1
가장 가까운 값으로 반올림합니다. 예를 들어 : 0.018은 내가 이것을 할 때 0.02로 변환됩니다.
karan patel

3

어쩌면 Math.floor(value * 100) / 100? 같은 값 3.54double.


3

NumberFormat Class 객체를 사용하여 작업을 수행 할 수 있습니다.

// Creating number format object to set 2 places after decimal point
NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(2);            
nf.setGroupingUsed(false);

System.out.println(nf.format(precision));// Assuming precision is a double type variable

3

3.545555555는 3.54를 얻습니다. 이를 위해 다음을 시도하십시오.

    DecimalFormat df = new DecimalFormat("#.##");

    df.setRoundingMode(RoundingMode.FLOOR);

    double result = new Double(df.format(3.545555555);

이것은 3.54를 줄 것입니다!


하지만이 값을 3.50123으로 설정하면 3.5를 얻을 수 있습니다
Cyrus

1

내가 사용하는 방법은 다음과 같습니다.

double a=3.545555555; // just assigning your decimal to a variable
a=a*100;              // this sets a to 354.555555
a=Math.floor(a);      // this sets a to 354
a=a/100;              // this sets a to 3.54 and thus removing all your 5's

다음과 같이 할 수도 있습니다.

a=Math.floor(a*100) / 100;

0

아마도 다음과 같습니다.

double roundTwoDecimals(double d) { 
      DecimalFormat twoDForm = new DecimalFormat("#.##"); 
      return Double.valueOf(twoDForm.format(d));
}  

다른 답변을 참조하십시오. 대답이 부동 소수점으로 표현되면 안정적으로 할 수 없습니다.
Marquis of Lorne

0

빠른 확인은 Math.floor 메서드를 사용하는 것입니다. 아래 소수점 이하 두 자리에 대해 double을 확인하는 방법을 만들었습니다.

public boolean checkTwoDecimalPlaces(double valueToCheck) {

    // Get two decimal value of input valueToCheck 
    double twoDecimalValue = Math.floor(valueToCheck * 100) / 100;

    // Return true if the twoDecimalValue is the same as valueToCheck else return false
    return twoDecimalValue == valueToCheck;
}

-1

나는 Mani 의 약간 수정 된 버전이 있습니다.

private static BigDecimal truncateDecimal(final double x, final int numberofDecimals) {
    return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_DOWN);
}

public static void main(String[] args) {
    System.out.println(truncateDecimal(0, 2));
    System.out.println(truncateDecimal(9.62, 2));
    System.out.println(truncateDecimal(9.621, 2));
    System.out.println(truncateDecimal(9.629, 2));
    System.out.println(truncateDecimal(9.625, 2));
    System.out.println(truncateDecimal(9.999, 2));
    System.out.println(truncateDecimal(3.545555555, 2));

    System.out.println(truncateDecimal(9.0, 2));
    System.out.println(truncateDecimal(-9.62, 2));
    System.out.println(truncateDecimal(-9.621, 2));
    System.out.println(truncateDecimal(-9.629, 2));
    System.out.println(truncateDecimal(-9.625, 2));
    System.out.println(truncateDecimal(-9.999, 2));
    System.out.println(truncateDecimal(-9.0, 2));
    System.out.println(truncateDecimal(-3.545555555, 2));

}

산출:

0.00
9.62
9.62
9.62
9.62
9.99
9.00
3.54
-9.62
-9.62
-9.62
-9.62
-9.99
-9.00
-3.54

-2

이것은 나를 위해 일했습니다.

double input = 104.8695412  //For example

long roundedInt = Math.round(input * 100);
double result = (double) roundedInt/100;

//result == 104.87

개인적으로이 버전은 문자열 (또는 유사)로 변환 한 다음 형식을 지정하는 대신 숫자로 반올림을 수행하기 때문에 개인적으로 좋아합니다.


1
원래 질문은 반올림이 아닌 자르기에 관한 것입니다. 또한 double이 충분히 크면 double을 long으로 변환하는 것이 전혀 작동하지 않습니다.
blm

-2
//if double_v is 3.545555555
String string_v= String.valueOf(double_v);
int pointer_pos = average.indexOf('.');//we find the position of '.'
string_v.substring(0, pointer_pos+2));// in this way we get the double with only 2 decimal in string form
double_v = Double.valueOf(string_v);//well this is the final result

글쎄, 이것은 약간 어색 할 수 있지만 문제를 해결할 수 있다고 생각합니다. :)


이 코드는 작업을 완료하지만 우아하지 않고 성능이 떨어집니다. 학교 프로젝트에서는 괜찮을지 모르지만 나중에 두통이 생기지 않는 한 누군가가 모든 시스템의 프로덕션에서 사용할 솔루션은 아닙니다.
cbaldan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.