Rumah > Soal Jawab > teks badan
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));
高洛峰2017-04-18 10:53:52
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"
伊谢尔伦2017-04-18 10:53:52
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。
等待大神解答