84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
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
首先,指出一个问题:构建 BigDecimal 的时候,尽量不要使用浮点数(double,float),因为浮点数在计算机中的存储存在精度缺失问题。比如你的写的代码:
BigDecimal
double
float
public static void main(String[] args) throws Exception { double a = 1.505; BigDecimal bd = new BigDecimal(a); System.out.println("bd: " + bd.toString()); }
运行结果:
可以看到,浮点数 1.505 在计算机中没法存储的 —— 具体原因如果不知道,请自行搜索 “浮点数精度缺失问题”
第二,如果需要输出 1.51,即常说的 “四舍五入”,那么需要指定 DecimalFormat 的舍入模式:
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)); }
如果不了解 RoundingMode 的用法,请自行搜索 “RoundingMode 的用法”
RoundingMode
第三,关于 DecimalFormat 括号里的字符串代表的意思,请自行搜索 “DecimalFormat 的用法”
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。 等待大神解答
首先,指出一个问题:构建
BigDecimal
的时候,尽量不要使用浮点数(double
,float
),因为浮点数在计算机中的存储存在精度缺失问题。比如你的写的代码:运行结果:
可以看到,浮点数 1.505 在计算机中没法存储的 —— 具体原因如果不知道,请自行搜索 “浮点数精度缺失问题”
第二,如果需要输出 1.51,即常说的 “四舍五入”,那么需要指定
DecimalFormat
的舍入模式:运行结果:
如果不了解
RoundingMode
的用法,请自行搜索 “RoundingMode 的用法”第三,关于
DecimalFormat
括号里的字符串代表的意思,请自行搜索 “DecimalFormat 的用法”