Java中double类型四舍五⼊⽅法
项⽬要对⼀个double值保留⼩数点后3位,⽹上到好⼏种⽅法,选⼀个⽤在项⽬中,实测发现有误差,再换⼀种,还是会有误差。最后经
过多种情况测试,发现最后2种是精确的。
[java]
1. stndk;
2.
3. import java.math.BigDecimal;
4. import java.math.RoundingMode;
5. DecimalFormat;
6. NumberFormat;
7.
bigdecimal除法保留小数
8. /**
9.  * Created by D.bj on 2017/1/5.
10.  */
11. public class DoubleTest {
12.    /**
13.      * 保留3位⼩数,四舍五⼊的⼀个⽼⽅法
14.      * @param d
15.      * @return
16.      */
17.    public static double formatDouble1(double d) {
18.        return (und(d*1000)/1000;
19.    }
20.
21.
22.    /**
23.      * The BigDecimal class provides operations for arithmetic, scale manipulation, rounding, comparison, hashing, and format c
24.      * @param d
25.      * @return
26.      */
27.    public static double formatDouble2(double d) {
28.        // 旧⽅法,已经不再推荐使⽤
29. //        BigDecimal bg = new BigDecimal(d).setScale(2, BigDecimal.ROUND_HALF_UP);
30.
31.        // 新⽅法,如果不需要四舍五⼊,可以使⽤RoundingMode.DOWN
32.        BigDecimal bg = new BigDecimal(d).setScale(3, RoundingMode.UP);
33.        return bg.doubleValue();
34.    }
35.
36.    /**
37.      * NumberFormat is the abstract base class for all number formats.
38.      * This class provides the interface for formatting and parsing numbers.
39.      * @param d
40.      * @return
41.      */
42.    public static String formatDouble3(double d) {
43.        NumberFormat nf = NumberInstance();
44.        // 保留3位⼩数
45.        nf.setMaximumFractionDigits(3);
46.        // 如果不需要四舍五⼊,可以使⽤RoundingMode.DOWN
47.        nf.setRoundingMode(RoundingMode.UP);
48.
49.        return nf.format(d);
50.    }
51.
52.    /**
53.      * DecimalFormat is a concrete subclass of NumberFormat that formats decimal numbers.
54.      * @param d
55.      * @return
56.      */
57.    public static String formatDouble4(double d) {
58.        DecimalFormat df = new DecimalFormat("#0.000");
59.        return df.format(d);
60.    }
61.
62.
63.    /**
64.      * 如果只是⽤于程序中的格式化数值然后输出,那么这个⽅法还是挺⽅便的。
65.      * 应该是这样使⽤:System.out.println(String.format("%.3f", d));
66.      * @param d
67.      * @return
68.      */
69.    public static String formatDouble5(double d) {
70.        String str = String.format("%.3f", d);
71.        // double dscore = Double.parseDouble(str);
72.        return str;
73.    }
74.
75.    public static void main(String[] args) {
76.        double d = 0.001254;
77.
78.        System.out.println(formatDouble1(d));
79.        System.out.println(formatDouble2(d));
80.        System.out.println(formatDouble3(d));
81.        System.out.println(formatDouble4(d));
82.        System.out.println(formatDouble5(d));
83.    }
83.    }
84. }
对double d的值进⾏各种情况的赋值,如整数有值,整数为0,⼩数位数不够,⼩数四舍五⼊。经测试,前4种⽅法都会出现⼀些不精确的情况,只有最后种最精确。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。