3
BigDecimal val = BigDecimal.valueOf(0.20);
System.out.println(a);

0.20値ではなく値を val に保存したい0.2。私は何ができますか ?

NumberFormatこの場合は使用できないと思います。使用するときNumberFormatは、10 進数の長さを知っておく必要があります。0.20 または 0.5000 を持つことができます。10 進数の正確な長さがわからないため、使用できません。

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

また

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

ポイントの後に数字が 2 つしかないか、数字が 5 つ以上ある場合、このプログラムは機能しません。

 BigDecimal a = BigDecimal.valueOf(0.20);//i give an example of 0.2 i can have 0.98...0
         System.out.println(a);

         NumberFormat nf1 = NumberFormat.getInstance();
         System.out.println(nf1.format(0.5000));
4

4 に答える 4

7

BigDecimal は末尾のゼロを記憶します - 重大な副作用があります:

BigDecimal bd1 = new BigDecimal("0.20"); 
BigDecimal bd2 = new BigDecimal("0.2");

System.out.println(bd1);
System.out.println(bd2);
System.out.println(bd1.equals(bd2));

印刷します

0.20
0.2
false

また、小数展開にピリオドがある数値には BiGDecimal を使用できないことを覚えておく必要があります。

BigDecimal.ONE.divide(new BigDecimal(3));

例外をスローします(コメントであなたの懸念に部分的に答えるもの)

于 2012-05-18T13:44:14.673 に答える
3

double を に渡していますBigDecimal.valueOf()。と0.20は double とまったく同じ0.2です。String を渡すと、BigDecimal の位取りが String の小数点以下の桁数から推定されるため、結果は異なります。

BigDecimal bd1 = new BigDecimal("0.20");
BigDecimal bd2 = new BigDecimal("0.2");

System.out.println(bd1.toPlainString() + ", scale = " + bd1.scale()); // 0.20, scale = 2
System.out.println(bd2.toPlainString() + ", scale = " + bd2.scale()); // 0.2, scale = 1

NumberFormat nf = NumberFormat.getInstance();

nf.setMinimumFractionDigits(bd1.scale());
System.out.println(nf.format(bd1)); // 0,20 (in French locale)

nf.setMinimumFractionDigits(bd2.scale());
System.out.println(nf.format(bd2)); // 0,2 (in French locale)
于 2012-05-18T13:49:02.807 に答える
3

BigDecimal の String コンストラクターを使用できます。スケールを保持します(これが必要です)。

BigDecimal val = new BigDecimal("0.20");

http://docs.oracle.com/javase/1.5.0/docs/api/java/math/BigDecimal.html#BigDecimal(java.lang.String )を参照してください

于 2012-05-18T13:45:17.527 に答える
0

EDIT: this answer is wrong as pointed out in the comments :| thx Andreas_D

The problem is that there is no mathematical difference between 0.2 and 0.20 so your only chance is to display a certain number of digits after the decimal point. Once you store 0.2 or 0.20 in a BigDecimal they are indistinguishable from each other

于 2012-05-18T13:44:06.030 に答える