1

1 つの実装に取り​​組んでいるときに、2 つの場所で表示される量の違いを見ました。さらにデバッグを行っているときに、この情報を見つけました。

2 つの小数点以下の値があり、両方とも小数点以下 2 桁に丸められます。

double value =1091.225;
double value1 =48.125;

System.out.println((double)Math.round(value * 100) / 100);      
System.out.println((double)Math.round(value1 * 100) / 100);


BigDecimal price = new BigDecimal(value);
price = price.setScale(2, RoundingMode.UP);
double val= ((long) (value < 0 ? value * 100 - 0.5 : value * 100 + 0.5)) / 100.0;


BigDecimal price1 = new BigDecimal(value1);
price1 = price1.setScale(2, RoundingMode.UP);
double val1= ((long) (value1 < 0 ? value1 * 100 - 0.5 : value1 * 100 + 0.5)) / 100.0;

System.out.println(val);
System.out.println(val1);

これらは結果です

1091.22
48.13
1091.22
48.13

ただし、値を次のように変更すると

double value =1091.255;
double value1 =48.125;

結果が違う

1091.26
48.13
1091.26
48.13

なぜこれが起こっているのかを理解するのを手伝ってもらえますか?

4

3 に答える 3

1

これは、10 進数値が正確な値として格納されておらず、long にキャストして小数部分を破棄しているためです。理解を深めるためにこれを試してください:

System.out.println(value * 100 + 0.5);
System.out.println((long)(value * 100 + 0.5));

これは印刷します

109122.99999999999
109122

したがって、100.0 で割ると 1091.22 になります。

しかし、他の値については印刷します

109126.00000000001
109126

したがって、100.0 で割ると 1091.26 になります。

于 2013-08-14T12:49:35.343 に答える
0

Math.round()ここで問題です。

public static int round(float a) 引数に最も近い int を返します。結果は、1/2 を加算し、結果の下限を取り、結果を型 int にキャストすることによって、整数に丸められます。つまり、結果は次の式の値と等しくなります: (int)Math.floor(a + 0.5f)

お役に立てれば。

また、小数点値はバイナリ形式で完全に表現できないため、精度が正確ではないことに注意してください。

これは役立つはずです。

于 2013-08-14T12:58:03.110 に答える