私は次を試しました、
double doubleVal = 1.745;
double doubleVal1 = 0.745;
BigDecimal bdTest = new BigDecimal( doubleVal);
BigDecimal bdTest1 = new BigDecimal( doubleVal1 );
bdTest = bdTest.setScale(2, BigDecimal.ROUND_HALF_UP);
bdTest1 = bdTest1.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("bdTest:"+bdTest); //1.75
System.out.println("bdTest1:"+bdTest1);//0.74 problemmmm ????????????
しかし、奇妙な結果になりました。どうして?
BigDecimalsをfloatまたはdoubleから決して構築しないでください。 intまたは文字列から構築します。浮動精度と倍精度の緩い精度。
このコードは期待どおりに機能します(タイプをdoubleからStringに変更しただけです)。
public static void main(String[] args) {
String doubleVal = "1.745";
String doubleVal1 = "0.745";
BigDecimal bdTest = new BigDecimal( doubleVal);
BigDecimal bdTest1 = new BigDecimal( doubleVal1 );
bdTest = bdTest.setScale(2, BigDecimal.ROUND_HALF_UP);
bdTest1 = bdTest1.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("bdTest:"+bdTest); //1.75
System.out.println("bdTest1:"+bdTest1);//0.75, no problem
}
double doubleVal = 1.745;
double doubleVal1 = 0.745;
System.out.println(new BigDecimal(doubleVal));
System.out.println(new BigDecimal(doubleVal1));
出力:
1.74500000000000010658141036401502788066864013671875
0.74499999999999999555910790149937383830547332763671875
これは、2つのdoubleの実際の値を示し、得られる結果を説明しています。他の人が指摘したように、doubleコンストラクターを使用しないでください(doubleの実際の値を表示したい特定のケースを除きます)。
倍精度の詳細:
BigDecimal.valueOf(double d)
の代わりにnew BigDecimal(double d)
を使用します。最後のものには、floatおよびdoubleによる精度エラーがあります。
これにより、何がうまくいかなかったかのヒントが得られるかもしれません。
_import Java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal bdTest = new BigDecimal(0.745);
BigDecimal bdTest1 = new BigDecimal("0.745");
bdTest = bdTest.setScale(2, BigDecimal.ROUND_HALF_UP);
bdTest1 = bdTest1.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("bdTest:" + bdTest);
System.out.println("bdTest1:" + bdTest1);
}
}
_
問題は、入力(_double x=0.745;
_)が0.745を正確に表現できないことです。実際には、わずかに低い値が保存されます。 BigDecimals
の場合、これはすでに0.745未満であるため、切り捨てられます...
BigDecimal(double/float)
コンストラクターを使用しないようにしてください。
あなたの興味のために、double
で同じことをする
double doubleVal = 1.745;
double doubleVal2 = 0.745;
doubleVal = Math.round(doubleVal * 100 + 0.005) / 100.0;
doubleVal2 = Math.round(doubleVal2 * 100 + 0.005) / 100.0;
System.out.println("bdTest: " + doubleVal); //1.75
System.out.println("bdTest1: " + doubleVal2);//0.75
あるいは単に
double doubleVal = 1.745;
double doubleVal2 = 0.745;
System.out.printf("bdTest: %.2f%n", doubleVal);
System.out.printf("bdTest1: %.2f%n", doubleVal2);
両方印刷
bdTest: 1.75
bdTest1: 0.75
コードをできるだけシンプルにすることを好みます。 ;)
@mshutovが指摘しているように、半分の値が常に切り上げられるようにするには、もう少し追加する必要があります。これは、265.335
は、表示されるよりも少し小さくなります。