2011-12-05 4 views

답변

19

나는 표준 라이브러리는 이러한 기능을 가지고 있다고 생각하지 않습니다.

문제는 다음

당신이 (즉, 양의 값을 내림, 음의 값을 반올림) 숫자가 0보다 크거나 작은 여부에 따라 (수학적으로 말하기) 매우 다른 행동을 요구하는 것입니다 방법이 사용될 수있다 :

public double myRound(double val) { 
    if (val < 0) { 
     return Math.ceil(val); 
    } 
    return Math.floor(val); 
} 
+1

+1 : 지금까지 옳은 일을 수행하는 유일한 대답 (AFAICS). –

0

언제나 절사를 원하는 것처럼 보입니까? 당신은 Math.floor 대신

public static double floor(double a)

가 이 인수의 값 이하로, 계산 정수로 동일한 것을 가장 큰 (양의 무한대에 가장 가깝다) double 값을 반환 할 수 있습니다. 특별한 경우 :

+8

'Math.floor()'는 -ve 무한대를 0으로 반올림합니다. –

5

그냥 int로 캐스팅하면됩니다.

편집 : 당신은 두 배를 유지하려면이 단순히 충분히 작동합니다 :

if (val < 0) 
    return -Math.floor(-val); 
else 
    return Math.floor(val); 

그리고 조금 더 영리없는 코드를 분기과 느낌을 원하는 사람들을 위해 :

long tmp = Double.doubleToLongBits(val); 
tmp >>>= 63; 
return Math.floor(val) + tmp; 
+3

결과가 int 인 경우에 적합합니다 (큰 경우). – NPE

+1

@aix 사실 충분히 그렇지만 번호를 나타낼 수있는 이중이 있음을 보장 할 수도 없습니다. 하지만 네, 그건 내 편이 뻔뻔 스럽네요;) – Voo

0

BigDecimal은 많은 rounding options을 제공합니다. 이 같은 길이로

+0

특히, 그것은 OPO의 요구를 해결하기 위해 DOWN을 사용합니다. 이것은 FLOOR가 올바른 수학적 동작을 따르는 점에서 FLOOR와는 다릅니다. – demongolem

9

캐스트 :이 0에 가까워 양수와 음수 모두 반올림

float x= 1.9; 

long y = (long)x; 

.

+2

결과가 'int'에 맞을 경우, 큰 값일 수 있습니다. – NPE

+1

왜 int로 캐스팅하여 long에 저장하겠습니까? '길게'던지십시오. – Kevin

+0

+1 :'long y = (long) x;'는'(int)' –

6

RoundingMode.DOWN을 사용하면 0으로 향하게됩니다.

예 :

BigDecimal value = new BigDecimal("1.4"); 
    value = value.setScale(0, RoundingMode.DOWN); 
    System.out.println(value.doubleValue()); 
    BigDecimal value1 = new BigDecimal("-1.4"); 
    value1 = value1.setScale(0, RoundingMode.DOWN); 
    System.out.println(value1.doubleValue()); 
+0

'BigDecimal'은'float' 또는'double'이 표현할 수있는 모든 값을 나타낼 수 있습니까? –

+0

BigDecimal은 Java에서 숫자를 나타내는 방법이므로 BigDecimal을 사용하는 것이 좋습니다. – mprabhat

+0

@Oli 예. BigDecimal는 임의의 정밀도의 10 진수이며, float 및 double 수있는 모든 값을 나타낼 수 있습니다. – Dunes

0

당신이 시도 할 수 있습니다 :

public static void main(String[] args) { 
     Double myDouble = -3.2; 
     System.out.println(myDouble.intValue()); //Prints -3 

    } 
1
y=sign(x)*floor(abs(x)) 

또는

y=sign(x)*round(abs(x)-0.5) 

는 자바로 구현하기 쉬워야한다.