Saya membutuhkan hasil sebagai berikut
100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00
.round()
atau .setScale()
? Bagaimana saya melakukan ini?
Saya membutuhkan hasil sebagai berikut
100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00
.round()
atau .setScale()
? Bagaimana saya melakukan ini?
Anda dapat menggunakan setScale()
untuk mengurangi jumlah digit pecahan menjadi nol. Dengan asumsi value
memegang nilai yang akan dibulatkan:
BigDecimal scaled = value.setScale(0, RoundingMode.HALF_UP);
System.out.println(value + " -> " + scaled);
Penggunaan round()
sedikit lebih rumit karena mengharuskan Anda menentukan jumlah digit yang akan dipertahankan. Dalam contoh Anda ini akan menjadi 3, tetapi ini tidak valid untuk semua nilai:
BigDecimal rounded = value.round(new MathContext(3, RoundingMode.HALF_UP));
System.out.println(value + " -> " + rounded);
(Perhatikan bahwa BigDecimal
objek tidak dapat diubah; keduanya setScale
dan round
akan mengembalikan objek baru.)
BigDecimal bd1 = new BigDecimal(100.12); BigDecimal bd2 = bd1.setScale(0, RoundingMode.HALF_UP); System.out.println(bd1.equals(bd2));
cetakan salahRoundingMode
apa itu? IniBigDecimal
Jika saya mengikuti jawaban Grodriguez
System.out.println("" + value); value = value.setScale(0, BigDecimal.ROUND_HALF_UP); System.out.println("" + value);
Ini adalah hasilnya
100.23 -> 100 100.77 -> 101
Yang tidak sesuai dengan keinginan saya, jadi saya akhirnya melakukan ini ..
System.out.println("" + value); value = value.setScale(0, BigDecimal.ROUND_HALF_UP); value = value.setScale(2, BigDecimal.ROUND_HALF_UP); System.out.println("" + value);
Inilah yang saya dapatkan
100.23 -> 100.00 100.77 -> 101.00
Ini memecahkan masalah saya untuk saat ini .. :) Terima kasih semua.
sumber
DecimalFormat
(seperti dalamnew DecimalFormat("###.00")
) untuk mengelola konversiBigDecimal
kembali ke string. Ini memberikan"101.00"
hasil untuk kedua nilai yang cuplikan dari @Grodriquez dan Anda buat.Inilah solusi yang sangat rumit, tetapi berhasil:
public static BigDecimal roundBigDecimal(final BigDecimal input){ return input.round( new MathContext( input.toBigInteger().toString().length(), RoundingMode.HALF_UP ) ); }
Kode Tes:
List<BigDecimal> bigDecimals = Arrays.asList(new BigDecimal("100.12"), new BigDecimal("100.44"), new BigDecimal("100.50"), new BigDecimal("100.75")); for(final BigDecimal bd : bigDecimals){ System.out.println(roundBigDecimal(bd).toPlainString()); }
Keluaran:
sumber
input.toBigInteger().toString().length()
bagian tersebut akan jauh lebih efisien dengan menggunakan logaritma, beberapa hal sepertiround_up(log(input)) + (1 if input is a power of ten, else 0)
Lihat saja:
http://download.oracle.com/javase/6/docs/api/java/math/BigDecimal.html#ROUND_HALF_UP
dan:
setScale(int precision, int roundingMode)
Atau jika menggunakan Java 6, maka
http://download.oracle.com/javase/6/docs/api/java/math/RoundingMode.html#HALF_UP
http://download.oracle.com/javase/6/docs/api/java/math/MathContext.html
dan lainnya:
setScale(int precision, RoundingMode mode); round(MathContext mc);
sumber
Saya tidak berpikir Anda bisa membulatkannya seperti itu dalam satu perintah. Mencoba
ArrayList<BigDecimal> list = new ArrayList<BigDecimal>(); list.add(new BigDecimal("100.12")); list.add(new BigDecimal("100.44")); list.add(new BigDecimal("100.50")); list.add(new BigDecimal("100.75")); for (BigDecimal bd : list){ System.out.println(bd+" -> "+bd.setScale(0,RoundingMode.HALF_UP).setScale(2)); } Output: 100.12 -> 100.00 100.44 -> 100.00 100.50 -> 101.00 100.75 -> 101.00
Saya menguji sisa contoh Anda dan mengembalikan nilai yang diinginkan, tetapi saya tidak menjamin kebenarannya.
sumber
Kamu ingin
round(new MathContext(0)); // or perhaps another math context with rounding mode HALF_UP
sumber
round
: "Jika pengaturan presisi adalah 0 maka tidak ada pembulatan."