web-dev-qa-db-ja.com

Math.roundを使用して小数点以下1桁に丸めますか?

これらの2つの変数があります

double num = 540.512
double sum = 1978.8

それから私はこの表現をしました

double total = Math.round((num/ sum * 100) * 10) / 10;

しかし、27.0になります。

実際、他にも多くの変数があり、式でそれらを使用すると、常に10の位で0になります。

32
user3344542

少し前に作成した便利なメソッド...

private static double round (double value, int precision) {
    int scale = (int) Math.pow(10, precision);
    return (double) Math.round(value * scale) / scale;
}
82
jpdymond

これを試して

例えば

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

出力:

55.54
22
user3381763

Math.roundメソッドはlong (またはintを渡す場合はfloat)を返し、Javaの整数除算が原因です。 doubleにキャストするか、10で除算するときにdoubleリテラルを使用します。どちらか:

double total = (double) Math.round((num / sum * 100) * 10) / 10;

または

double total = Math.round((num / sum * 100) * 10) / 10.0;

その後、取得する必要があります

27.3
15
rgettman
    Double toBeTruncated = new Double("2.25");

    Double truncatedDouble=new BigDecimal(toBeTruncated ).setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();

2.3を返します

13
Sankar

この操作や同様の操作を頻繁に行う必要がある場合は、自分で実装するよりも適切なライブラリを見つける方が便利な場合があります。

Precision を使用してApache Commons Mathから、 Functions を使用してColtを、そして tils を使用してWekaからの質問を解決するワンライナーを次に示します。

double value = 540.512 / 1978.8 * 100;
// Apache commons math
double rounded1 = Precision.round(value, 1);
double rounded2 = Precision.round(value, 1, BigDecimal.ROUND_HALF_UP);
// Colt
double rounded3 = Functions.round(0.1).apply(value)
// Weka
double rounded4 = Utils.roundDouble(value, 1)

Mavenの依存関係:

<dependency>
    <groupId>org.Apache.commons</groupId>
    <artifactId>commons-math3</artifactId>
    <version>3.5</version>
</dependency>

<dependency>
    <groupId>colt</groupId>
    <artifactId>colt</artifactId>
    <version>1.2.0</version>
</dependency>

<dependency>
    <groupId>nz.ac.waikato.cms.weka</groupId>
    <artifactId>weka-stable</artifactId>
    <version>3.6.12</version>
</dependency>
11
Mifeet

しかし、私の意見でははるかに読みやすいきちんとした代替案は、おそらくdoubleとStringの間の変換のために、やや効率が低下しています。

double num = 540.512;
double sum = 1978.8;

// NOTE: This does take care of rounding
String str = String.format("%.1f", (num/sum) * 100.0); 

答えを二重にしたい場合、もちろんそれを元に戻すことができます:

double ans = Double.parseDouble(str);
4
Micah Stairs
Double number = new Double("5.25");
Double tDouble = 
  new BigDecimal(number).setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();

これは戻ります5.3を返します

3
sankar ganesh
DecimalFormat decimalFormat = new DecimalFormat(".#");
String result = decimalFormat.format(12.763);                // -->  12.7
2
Dan Alboteanu

あなたの方法は正しいです、あなたがしなければならないのは、両方の10の後に.0を追加することであり、それはあなたの問題を解決します!

double example = Math.round((187/35) * 10.0) / 10.0;

出力は次のようになります。

5.3
2
user8982259