1

コード:

import java.math.*; 

public class x
{
  public static void main(String[] args)
  {
    BigDecimal a = new BigDecimal(0.1);
    BigDecimal b = new BigDecimal(0.7);
    System.out.println(a);
    System.out.println(b);
  }
}

出力:

0.1000000000000000055511151231257827021181583404541015625 0.6999999999999999555910790149937383830547332763671875

doubleこれは、与えられた値に最も近いを見つけることができるので便利です。しかし、値は実際の値よりも0.1大きく、値は小さくなります。0.7

10進数の両方の値(最も大きい値と最も小さい値)を取得するにはどうすればよいですか?

で始まりBigDecimal、それを変換してdoubleから10進数に戻すと仮定します。値が大きくなったり小さくなったりします。どうすれば他のものを手に入れることができますか?

4

3 に答える 3

2

nextAfter(二重開始、二重方向)を使用します。

import java.math.*;

public class a
{
  public static void printNeighbours(BigDecimal start)
  {
    double result1 = start.doubleValue();
    double result2;

    BigDecimal r1 = new BigDecimal(result1);

    int com = start.compareTo(r1);

    if(com != 0)
      result2 = Math.nextAfter(result1, com * Double.MAX_VALUE);
    else
    {
      result2 = Math.nextAfter(result1, Double.MAX_VALUE);
      result1 = Math.nextAfter(result1, -Double.MAX_VALUE);
      r1 = new BigDecimal(result1);
    }

    BigDecimal r2 = new BigDecimal(result2);

    System.out.println("starting:\t"+start);

    if(com<0)
    {
      System.out.println("smaller:\t" + r2);        
      System.out.println("bigger:\t\t"+r1);
    }
    else
    {
      System.out.println("smaller:\t" + r1);        
      System.out.println("bigger:\t\t"+r2);
    }

    System.out.println();
  }

  public static void main(String[] args)
  {
    printNeighbours(new BigDecimal("0.25"));
    printNeighbours(new BigDecimal("0.1"));
    printNeighbours(new BigDecimal("0.7"));
  }
}

プリントアウト:

starting:   0.25
smaller:    0.2499999999999999722444243843710864894092082977294921875
bigger:     0.250000000000000055511151231257827021181583404541015625

starting:   0.1
smaller:    0.09999999999999999167332731531132594682276248931884765625
bigger:     0.1000000000000000055511151231257827021181583404541015625

starting:   0.7
smaller:    0.6999999999999999555910790149937383830547332763671875
bigger:     0.70000000000000006661338147750939242541790008544921875
于 2012-05-18T11:44:10.347 に答える
1

Math.ulp(double)メソッドはこれに役立つ場合があります。指定された値の可能な浮動小数点精度のようなものを返します。

引数の ulp のサイズを返します。double 値の ulp は、この浮動小数点値と次に大きさが大きい double 値との間の正の距離です。非 NaN x の場合、ulp(-x) == ulp(x) であることに注意してください。

次に例を示します。

System.out.println(new BigDecimal(0.1).subtract(new BigDecimal(Math.ulp(0.1))));
System.out.println(new BigDecimal(0.7).add(new BigDecimal(Math.ulp(0.7))));
于 2012-05-17T14:53:35.767 に答える
0

Integer または String に基づいて BigDecimal を作成します。

// String:
BigDecimal a = new BigDecimal("0.1");

// Integer
BigDecimal b = (new BigDecimal(7)).movePointLeft(1);

そのような結果は得られません。

于 2012-05-17T14:49:10.430 に答える