2011-12-05 8 views
14

ゼロに向かってJavaで丸める方法は?Javaでゼロ方向に丸めます

したがって、-1.9が-1.0になり、-0.2が0.0になり、3.4が3.0になります。

Math.round()は、この変更を行うことができるパラメータですか?

+0

'x-x%1'(Javaのみ) – Museful

答えて

19

私は標準ライブラリには、このような機能を持っていることを信じていません。

問題は、次の

あなたは(つまり、正の値のためにダウン丸め、負の値の切り上げ)数が0よりも大きいか小さいかに応じて、(数学的に言えば)非常に異なる行動を求めているということですこの方法を使用することができる:

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

+1:正しいこと(AFAICS)を行う唯一の答えです。 –

0

いつも切り捨てたいのですか?あなたは が引数より大きくないと数学 整数に等しいこと(無限大にもっとも近い)double値を返します

代わりMath.floor

public static double floor(double a)

を使用することができます。特別なケース:

+8

' Math.floor() 'は-veの無限大の方向に丸められ、ゼロではありません。 –

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'に収まるならば、それは大きなifであるかもしれません。 – NPE

+1

@aix十分に真実ですが、数字を表す倍数が存在することを保証することもできません。しかし、それは私の側でニックピッキングしています;) – Voo

0

BigDecimalには多くのものがあります。rounding optionsこのような長いへ

+0

特に、それは、FLOORが正しい数学的挙動に従うという点で、FLOORとは異なるOPの必要性を解決するために、DOWNになります。 – demongolem

9

キャスト:これはゼロに向かって正と負の数の両方を丸め

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を使用すると、ゼロに向かって進みます。

例:

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 Yes。 BigDecimalは任意の精度の小数であり、浮動小数点数と二倍数以上のすべての値を表すことができます。 – 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) 

Javaで実装が容易でなければなりません。

関連する問題