萌新今晚用java刷题时候,发现让人保留两位小数的题,查百度之后发现有四种方法。然而我觉得我百度到的方法我都看不懂(´-ι_-`)。于是在我多方查证以及自我实验之后总结一下。
借助字符串输出
类似于C语言的输出,%.nf
,n来控制小数点后四舍五入保留几位。
double p = 3.1415926;
String a = String.format("%.9f",pi);
String b = String.format("%.3f",pi);
System.out.println("String.format处理的a = "+a);
System.out.println("String.format处理的b = "+b);
System.out.println("String.format处理之后pi = "+pi);
输出:
String.format处理的a = 3.141592600
String.format处理的b = 3.142
String.format处理之后pi = 3.1415926``
BigDecimal 的RoundingMode 舍位模式
//BigDecimal四舍五入法保留两位小数
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Main {
public static void main(String[] args) {
double number=3.1415926;
BigDecimal n = new BigDecimal(String.valueOf(number)).setScale(2, RoundingMode.HALF_UP);
//详见下面补充的的RoundingMode.XXX各种用法
System.out.println(n);
}
}
输出:3.14
备注: new BigDecimal(number)
值和number
不一样,具体原因可以去查BigDecimal用法。new BigDecimal(String.valueOf(number))
可以保证精度。
RoundingMode.XXX
- RoundingMode.CEILING:向右取整 //简单理解ceiling 美[ˈsilɪŋ] n.最高限度
- 3.1->3
- -5.4->-4
- RoundingMode.FLOOR:向左取整
- 1.9->1
- -5.3->-6
- RoundingMode.DOWN:向0取整 //即负数向右取整,正数向左取整
- 1.6->1
- -1.6->-1
- RoundingMode.UP:远离0取整 //即负数向左取整,正数向右取整
- RoundingMode.HALF_DOWN :五舍六入
- -1.5->-1
- 1.5->1
- 1.6->1
- RoundingMode.HALF_UP :四舍五入
- RoundingMode.HALF_EVEN :四舍六入五取偶 //称为“银行家舍入法”
- 1.14->1.1
- 1.16->1.2
- 1.15->1.2
- 1.25->1.2
- 1.2354->1.24(保留2位小数)
银行家舍入法:当舍去位的数值小于5时,直接舍去该位;当舍去位的数值大于等于6时,在舍去该位的同时向前位进一;当舍去位的数值等于5时,如果前位数值为奇,则在舍去该位的同时向前位进一,如果前位数值为偶,则直接舍去该位。
简单说就是:四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一
DecimalFormat方法
import java.text.DecimalFormat;
public class Main {
public static void main(String[] args) {
DecimalFormat a = new DecimalFormat("0.0");
DecimalFormat b = new DecimalFormat("#.#");
DecimalFormat c = new DecimalFormat("000.000");
DecimalFormat d = new DecimalFormat("###.###");
DecimalFormat e1 = new DecimalFormat("000000.###");
DecimalFormat e2 = new DecimalFormat("000,000.###");
System.out.println(a.format(12.34)); //结果12.3
System.out.println(b.format(12.34)); //结果12.3
System.out.println(c.format(12.34)); //结果012.340
System.out.println(d.format(12.34)); //结果12.34
System.out.println(e1.format(12.34)); //结果000012.34
System.out.println(e2.format(12.34)); //结果000,012.34
}
}
DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。
以上举的举个例子可以发现一些规律,但是我总结的很啰嗦,(´・ω・`)可能你们看了更糊涂,所以你们自悟吧。
升华一下
ヽ(•̀ω•́ )ゝBigDecimal和DecimalFormat到底有什么区别呢?看图自悟