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小时内删除。
发表评论