JavaRush /Blog Java /Random-MS /Membundarkan nombor di Jawa

Membundarkan nombor di Jawa

Diterbitkan dalam kumpulan
Nombor titik terapung (terapung, berganda) digunakan semasa mengira ungkapan yang memerlukan ketepatan perpuluhan. Ketepatan yang tinggi sering diperlukan dalam perakaunan dan operasi pengkomputeran lain. Membundarkan nombor dalam Java - 1Tetapi adakah kita sentiasa memerlukan "ekor" nombor yang panjang selepas titik perpuluhan? Mungkin ketepatan tiga bahagian sebenar sudah cukup untuk kita? Dan kami berpuas hati dengan pilihan ini, bagaimana untuk melakukan pembundaran dengan betul? Inilah yang akan kita bincangkan hari ini: kita akan melihat cara untuk membundarkan nombor dalam Java .

Format rentetan

Sebagai kaedah pertama, kita akan melihat pembundaran dua kali:
double value = 34.766674;
String result = String.format("%.3f",value);
System.out.print(result);//  34,767
Akibatnya, kami akan memformatkan nombor titik terapung kami 34766674 dengan ketepatan 3 tempat perpuluhan , kerana dalam arahan pemformatan kami menetapkan tiga tempat perpuluhan "%.3f. Sebaliknya, %f apabila memformat rentetan menunjukkan jenis titik terapung nombor, yang merangkumi jenis data berganda dan terapung dalam Java. Dalam contoh di atas, kami mengeluarkan nilai yang terhasil kepada konsol. Sekarang persoalannya ialah: bagaimana kita boleh memendekkan ini? Mudah sahaja: anda perlu menggunakan printf, yang seterusnya ialah format + cetakan. Akibatnya, contoh Kami yang terdahulu akan dikurangkan kepada:
double value = 34.766674;
System.out.printf("%.3f",value);
Sebagai tambahan kepada kaedah ini , contoh keluar kelas PrintStream juga mempunyai kaedah format, yang berfungsi sama:
double value = 34.766674;
System.out.format("%.3f",value);
Pembundaran berlaku dalam mod HALF_UP - ke arah nombor yang lebih dekat dengan yang dipotong (kepada 0 atau 10). Jika nombor ini adalah sama jarak (dalam kes 5), maka pembundaran dilakukan ke atas. Contoh:
String firstResult = String.format("%.3f",7.0004);// 7,000
String secondResult = String.format("%.3f",7.0005);// 7,001
String thirdResult = String.format("%.3f",7.0006);// 7,001
Kami akan membincangkan mod pembundaran dengan lebih terperinci di bawah. Membundarkan nombor dalam Java - 2

Format Perpuluhan

Pilihan lain ialah menggunakan kelas DecimalFormat . Ia direka untuk memformat sebarang nombor dalam Java, sama ada nombor bulat atau nombor terapung. Apabila kita membuat instantiat DecimalFormat, kita boleh menghantarnya rentetan format. Ia akan menunjukkan bilangan tempat perpuluhan untuk diformatkan untuk input. Ini adalah contoh kami akan kelihatan seperti menggunakan DecimalFormat :
double value = 34.766674;
DecimalFormat decimalFormat = new DecimalFormat( "#.###" );
String result = decimalFormat.format(value);
System.out.print(result);//34,767
Baris #.### ialah corak yang menunjukkan bahawa kami sedang memformatkan nilai yang dihantar kepada 3 tempat perpuluhan. Untuk menukar corak selepas objek DecimalFormat telah dibuat, anda boleh menggunakan kaedah applyPattern dan applyLocalizedPattern :
DecimalFormat decimalFormat = new DecimalFormat("#.###");
decimalFormat.applyPattern("#.#");
decimalFormat.applyLocalizedPattern("#.#####");
Tetapi hari ini kita bercakap tentang pembundaran, bukan? Apabila memotong nombor dengan tempat perpuluhan di luar corak yang ditentukan, DecimalFormat membundarkan nombor itu ke atas jika nombor terpotong terakhir lebih besar daripada 5. Tetapi bagaimana jika nombor itu ialah 5? Ternyata ia betul-betul di tengah-tengah antara integer terdekat. Selepas itu, apa? Dalam kes ini, nombor sebelumnya diambil kira. Jika genap, pembundaran dilakukan:
DecimalFormat decimalFormat = new DecimalFormat("#.###");
String result = decimalFormat.format(7.4565);
System.out.println((result));// 7,457
Jika ganjil, ia tidak dilakukan:
DecimalFormat decimalFormat = new DecimalFormat("#.###");
String result = decimalFormat.format(7.4575);
System.out.println((result));// 7,457
Terdapat sedikit perbezaan antara memformat nombor titik terapung menggunakan String.format() dan DecimalFormat.format(). Yang pertama akan sentiasa mencetak sifar mengekor walaupun tiada bahagian pecahan. Cth:
String firstResult = String.format("%.3f", 7.000132);
System.out.println((firstResult)); // 7.000

DecimalFormat decimalFormat = new DecimalFormat("#.###");
String secondResult = decimalFormat.format(7.000132);
System.out.println((secondResult));  // 7
Seperti yang dapat kita lihat, apabila memformat nombor 7.000132 kepada tiga tempat perpuluhan, kaedah format() String akan mengeluarkan 7.000, manakala kaedah format() DecimalFormat akan mengeluarkan 7. Iaitu, anda boleh memilih String.format() atau DecimalFormat.format( ) bergantung pada sama ada anda memerlukan sifar di belakang atau tidak. Menggunakan kaedah yang diterangkan di atas, kami menerima hasilnya dalam bentuk rentetan. Mari lihat cara untuk mendapatkan kembali nilai angka dengan tepat.

Matematik

Adalah mustahil untuk tidak menyebut kelas khas yang disesuaikan untuk pelbagai operasi aritmetik dengan nombor - Matematik . Membundarkan nombor dalam Java - 3Kelas ini juga mempunyai kaedah untuk pembundaran, tetapi tidak seperti yang telah diterangkan, mereka tidak membenarkan anda menetapkan bilangan tempat perpuluhan tertentu, sebaliknya membundarkan kepada integer:
  • Math.ceil() membundarkan kepada integer terdekat, tetapi tidak mengembalikan jenis integer, tetapi double:

    double value = 34.777774;
    double result = Math.ceil(value);
    System.out.println((result)); //35.0

    Walaupun kita mempunyai 34.0000000, selepas menggunakan Math.ceil kita masih akan mendapat 35.0.

    Math.floor() membundarkan ke bawah kepada integer terdekat, juga mengembalikan hasilnya sebagai dua kali ganda:

    double value = 34.777774;
    double result = Math.floor(value);
    System.out.println((result)); //34.0

    Sekali lagi, walaupun kita mempunyai nilai 34.999999999, maka selepas menggunakan Math.floor kita akan mendapat 34.0.

  • Math.round () - membundarkan kepada integer terdekat, memberikan hasil int:

    double value = 34.777774;
    int result = Math.round(value);
    System.out.println((result)); //35

    Jika nombor kami ialah 34.5, ia dibundarkan kepada 35, tetapi jika kurang sedikit daripada 34.499, nombor itu dipotong kepada 34.

    Untuk tidak hanya memotong keseluruhan bahagian sebenar, tetapi untuk mengawal proses ini kepada bilangan tempat perpuluhan tertentu dan pada masa yang sama bulat, nombor itu didarabkan dengan 10^n (10 kepada kuasa n), di mana n adalah sama dengan bilangan tempat perpuluhan yang diperlukan. Selepas ini, beberapa kaedah kelas Matematik digunakan untuk membundar, dan kemudian dibahagikan sekali lagi dengan 10^n:

    double value = 34.777774;
    double scale = Math.pow(10, 3);
    double result = Math.ceil(value * scale) / scale;
    System.out.println((result)); //34.778

    Math.pow - mengambil dua hujah. Yang pertama ialah nombor, yang kedua ialah kuasa yang perlu dibangkitkan.

Membundarkan dengan BigDecimal

BigDecimal ialah kelas yang membolehkan anda bekerja dengan nombor titik terapung. Khususnya, ciri utamanya ialah ia boleh menyimpan nombor pecahan dengan panjang sewenang-wenangnya (iaitu, tiada had pada julat nombor). Di samping itu, kelas ini menyimpan pelbagai kaedah untuk pemprosesan aritmetik, termasuk pembundaran. Kelas objek ini boleh dibuat dengan menetapkan pembina untuk menggandakan, rentetan untuk memaparkan nombor titik terapung, double dan MathContext , dan sebagainya. MathContext ialah gabungan RoundingMode dan nombor yang menerangkan jumlah bilangan digit dalam nilai yang dicari. Peraturan pembundaranMod Pembundaran: BAWAH - membundar ke arah sifar. KE ATAS —pembundaran daripada mod sifar. SILING - membundar ke arah infiniti positif. LANTAI - membundar ke arah infiniti negatif. HALF_UP - Bundarkan kepada "jiran terdekat" jika kedua-dua jiran tidak sama jarak (iaitu, apabila nombor yang dibundarkan ialah 5). Dalam kes ini, pembundaran dilakukan. HALF_DOWN - membundar ke arah "jiran terdekat". Jika kedua-dua jiran tidak sama jarak, dalam kes ini bulatkan ke bawah. HALF_EVEN - Bundarkan kepada "jiran terdekat" jika kedua-dua jiran tidak sama jarak. Dalam kes ini, bulatkan kepada jiran genap (seperti dalam DecimalFormat yang diterangkan di atas). TIDAK PERLU - Digunakan untuk mengesahkan bahawa operasi yang diminta mempunyai hasil yang betul. Oleh itu, pembundaran tidak diperlukan. Contoh:
MathContext context = new MathContext(5, RoundingMode.HALF_UP);
double value = 34.777554;
BigDecimal result = new BigDecimal(value, context);
System.out.println(result); //34.778
Sebagai tambahan kepada keupayaan untuk menetapkan peraturan pembundaran dalam pembina, BigDecimal membenarkan anda menetapkan mod pembundaran selepas kejadian dibuat. Untuk melakukan ini, gunakan kaedah setScale , di mana anda perlu menetapkan bilangan tempat perpuluhan dan peraturan pembundaran:
double value = 34.777554;
BigDecimal result = new BigDecimal(value);
result = result.setScale(3, RoundingMode.DOWN);
System.out.println(result); //34.777
BigDecimal juga mempunyai pembolehubah int dalaman yang direka untuk menetapkan mod pembulatan ( ROUND_DOWN , ROUND_CEILING , ROUND_FLOOR ...) Ini adalah peraturan pembundaran yang serupa dengan yang dibentangkan dalam kelas RoundingMode dan digunakan sama dalam setScale :
BigDecimal result = new BigDecimal(value);
result = result.setScale(3, BigDecimal.ROUND_DOWN);
Baca lebih lanjut mengenai kelas BigDecimal dalam artikel ini .
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION