代码如下,java用BigDecimal四舍五入怎么还有问题呀?哪种方式是完全没有问题的?
ringa_lee
ringa_lee 2017-04-18 10:51:52
0
2
743

1.为什么不是1.51?输出的是1.50

2.decimalformat括号里的字符串代表了什么意思?有模板吗?如果是别的格式应该怎么写

3.为什么要用#号而不是0.00?如果是#好的话,当a是0.505的时候有bug

        double a =1.505;
        BigDecimal bd = new BigDecimal(a);
        System.out.println(new DecimalFormat("#.00").format(bd));
ringa_lee
ringa_lee

ringa_lee

membalas semua(2)
小葫芦

Pertama sekali, nyatakan masalah: semasa membina BigDecimal, cuba jangan gunakan nombor titik terapung (double, float), kerana terdapat kekurangan ketepatan dalam penyimpanan nombor titik terapung dalam komputer itu. Contohnya, kod yang anda tulis:

public static void main(String[] args) throws Exception {
    double a = 1.505;
    BigDecimal bd = new BigDecimal(a);

    System.out.println("bd: " + bd.toString());
}

Hasil jalankan:

Seperti yang anda lihat, titik terapung nombor 1.505 tidak boleh disimpan dalam komputer - jika anda tidak tahu sebab tertentu, sila cari sendiri "Masalah kehilangan ketepatan nombor titik terapung"


Kedua, jika anda perlu mengeluarkan 1.51, yang sering dipanggil "pembundaran", maka anda perlu menentukan mod pembundaran DecimalFormat:

public static void main(String[] args) throws Exception {
    BigDecimal bd = new BigDecimal("1.505");
    System.out.println("bd: " + bd.toString());

    DecimalFormat df = new DecimalFormat("#.00");
    df.setRoundingMode(RoundingMode.HALF_UP);

    System.out.println("format: " + df.format(bd));
}

Hasil jalankan:

Jika anda tidak memahami penggunaan RoundingMode, sila cari "Penggunaan RoundingMode"


Ketiga, mengenai maksud rentetan dalam kurungan DecimalFormat, sila cari "Penggunaan Format Perpuluhan"

伊谢尔伦
    System.out.println(String.format("%.2f", a));
    System.out.println(new Formatter().format("%.2f", a));
    
    这两种是可以的。
  
  double d = 5.505;
  System.out.println(d)
  输出的是1.504xxxxxxxxx,所以java在做四舍五入的时候舍掉了后面的4xxxxxx。
  
  
  等待大神解答
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan