1. package com.example.newtest.test;
  2.  
  3. import java.math.BigDecimal;
  4. import java.math.RoundingMode;
  5. import java.text.DecimalFormat;
  6. import java.text.NumberFormat;
  7.  
  8. public class DoubleTest {
  9. /**
  10. * Math.round()
  11. *
  12. * @param d
  13. * @return
  14. */
  15. public static double formatDouble1(double d) {
  16. return (double) Math.round(d * 100) / 100;
  17. }
  18.  
  19. /**
  20. * new BigDecimal().setScale()
  21. *
  22. * @param d
  23. * @return
  24. */
  25. public static double formatDouble2(double d) {
  26. // 旧方法,已经不再推荐使用
  27. // BigDecimal bg = new BigDecimal(d).setScale(2, BigDecimal.ROUND_HALF_UP);
  28. // 新方法,如果不需要四舍五入,可以使用RoundingMode.DOWN
  29. BigDecimal bg = new BigDecimal(d).setScale(2, RoundingMode.UP);
  30. return bg.doubleValue();
  31. }
  32.  
  33. /**
  34. * NumberFormat().format()
  35. *
  36. * @param d
  37. * @return
  38. */
  39. public static String formatDouble3(double d) {
  40. NumberFormat nf = NumberFormat.getNumberInstance();
  41. // 保留两位小数
  42. nf.setMaximumFractionDigits(2);
  43. // 如果不需要四舍五入,可以使用RoundingMode.DOWN
  44. nf.setRoundingMode(RoundingMode.UP);
  45. return nf.format(d);
  46. }
  47.  
  48. /**
  49. * DecimalFormat().format
  50. *
  51. * @param d
  52. * @return
  53. */
  54. public static String formatDouble4(Double d) {
  55. //0表示如果该位置的数值无论大于0还是等于0都要显示占位;#表示如果该位置的数值大于0显示数值,如果等于0则不显示.
  56. //DecimalFormat("0.#0")这种情况下会抛异常
  57. //解读:#.00 表示两位小数 #.0000四位小数 以此类推…
  58. DecimalFormat df = new DecimalFormat("#.00");
  59. df.setRoundingMode(RoundingMode.HALF_UP); //默认是HALF_EVEN
  60. String res;
  61. res = df.format(new BigDecimal(d)); //18.14
  62. res = df.format(new BigDecimal(d.toString())); //18.15
  63. res = df.format(BigDecimal.valueOf(d)); //18.15
  64. //运行以上代码可以看到,结果是不一样的
  65. //原因: 使用参数为float或double的BigDecimal创建对象会丢失精度,因此不要使用参数为float或double的BigDecimal创建对象
  66. //解决办法:
  67. //使用BigDecimal(String val)的构造方法创建对象
  68. //使用使用BigDecimal的valueOf(double val)方法创建对象
  69. return res;
  70. }
  71.  
  72. /**
  73. * String.format()格式化输出
  74. * 解读: %.2f 中 %. 表示 小数点前任意位数 2 表示两位小数 格式后的结果为f 表示浮点型。
  75. * @param d
  76. * @return
  77. */
  78. public static String formatDouble5(double d) {
  79. return String.format("%.2f", d);
  80. }
  81.  
  82. public static void main(String[] args) {
  83. double d = 18.145;
  84. System.out.println(formatDouble1(d));
  85. System.out.println(formatDouble2(d));
  86. System.out.println(formatDouble3(d));
  87. System.out.println(formatDouble4(d));
  88. System.out.println(formatDouble5(d));
  89. }
  90. }

补充: BigDecimal.ROUND_HALF_XXX的各种用法

  1. 在银行、帐户、计费等领域,BigDecimal提供了精确的数值计算。其中8种舍入方式值得掌握。
  2.  
  3. 1ROUND_UP
  4.  
  5. 舍入远离零的舍入模式。
  6.  
  7. 在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。
  8.  
  9. 注意,此舍入模式始终不会减少计算值的大小。
  10.  
  11. 2ROUND_DOWN
  12.  
  13. 接近零的舍入模式。
  14.  
  15. 在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。
  16.  
  17. 注意,此舍入模式始终不会增加计算值的大小。
  18.  
  19. 3ROUND_CEILING
  20.  
  21. 接近正无穷大的舍入模式。
  22.  
  23. 如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;
  24.  
  25. 如果为负,则舍入行为与 ROUND_DOWN 相同。
  26.  
  27. 注意,此舍入模式始终不会减少计算值。
  28.  
  29. 4ROUND_FLOOR
  30.  
  31. 接近负无穷大的舍入模式。
  32.  
  33. 如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;
  34.  
  35. 如果为负,则舍入行为与 ROUND_UP 相同。
  36.  
  37. 注意,此舍入模式始终不会增加计算值。
  38.  
  39. 5ROUND_HALF_UP
  40.  
  41. 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。
  42.  
  43. 如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。
  44.  
  45. 注意,这是我们大多数人在小学时就学过的舍入模式(四舍五入)。
  46.  
  47. 6ROUND_HALF_DOWN
  48.  
  49. 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
  50.  
  51. 如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。
  52.  
  53. 7ROUND_HALF_EVEN 银行家舍入法
  54.  
  55. 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
  56.  
  57. 如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;
  58.  
  59. 如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。
  60.  
  61. 注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。
  62.  
  63. 此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。
  64.  
  65. 如果前一位为奇数,则入位,否则舍去。
  66.  
  67. 以下例子为保留小数点1位,那么这种舍入方式下的结果。
  68.  
  69. 1.15>1.2 1.25>1.2
  70.  
  71. 8ROUND_UNNECESSARY
  72.  
  73. 断言请求的操作具有精确的结果,因此不需要舍入。
  74.  
  75. 如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException
  76.  
  77. 因为我们是属于互联网金融行业,所有在进行计算的时候尽量使用ROUND_HALF_EVEN 银行家舍入法

  

java四舍五入及注意点的更多相关文章

  1. 【转】java取整和java四舍五入方法

    java取整和java四舍五入方法 import java.math.BigDecimal; import java.text.DecimalFormat; public class TestGetI ...

  2. java四舍五入BigDecimal和js保留小数点两位

    java四舍五入BigDecimal保留两位小数的实现方法: // 四舍五入保留两位小数System.out.println("四舍五入取整:(3.856)="      + ne ...

  3. Java四舍五入 保留小数

    java 四舍五入保留小数   // 方式一: double f = 3.1516; BigDecimal b = new BigDecimal(f); double f1 = b.setScale( ...

  4. java取整和java四舍五入方法 BigDecimal.setScale()方法详解

    import java.math.BigDecimal; public class TestGetInt { public static void main(String[] args) { doub ...

  5. java取整和java四舍五入方法 转自董俊杰

    import java.math.BigDecimal; import java.text.DecimalFormat; public class TestGetInt{ public static ...

  6. java四舍五入的取舍

    一.保留2位小数,且四舍五入 String re = new java.text.DecimalFormat("#.##").format(3.14555); 结果:3.15 二. ...

  7. JAVA 四舍五入Math.round方法

    今天由于测试场景,利息的计算中涉及小数点的保留.保留的规则是:两位小数+四舍五入方式 使用的语言是JAVA, 看了许多网上的方法.因为最后保留的小数还会进行计算.所以我考虑最好不要保留的结果是Stri ...

  8. java四舍五入

    package com.clzhang.sample; import java.math.BigDecimal; import java.math.RoundingMode; import java. ...

  9. java四舍五入保留两位小数4种方法

    4种方法,都是四舍五入,例: import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberF ...

随机推荐

  1. python子进程模块subprocess详解

    subprocess--子进程管理器一.subprocess 模块简介subprocess最早是在2.4版本中引入的.subprocess模块用来生成子进程,并可以通过管道连接它们的输入/输出/错误, ...

  2. nodejs express 部署

    一.express 4.x版本之前 全局安装express 命令是 npm install express -g express 4.x版本之后 全局安装express 命令是 npm install ...

  3. 一、Signalr WebApi客服-客户链接+Redis

    一.前端客服代码 <!doctype html> <html> <head> <meta charset="utf-8"> < ...

  4. js 一些小技巧

    Javascript 中的 绑定事件 on $(document).on("事件","元素","方法"): Js 定时方法 1.setTim ...

  5. yum 安装mysql-server 5.6

    # rpm ivh http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm # yum install -y mysql-s ...

  6. SpringFramework中的BeanWrapper丶PropertyEditor

    BeanWrapper是org.springframework.beans包下的一个借口,对应的实现类为BeanWrapperImpl,提供对应的get/set方法,并且设置属性的可读性和可写性. p ...

  7. 什么是lease机制?

    分布式系统理论之租约机制学习 一,租约机制介绍 在分布式系统中,往往会有一个中心服务器节点.该节点负责存储.维护系统中的元数据.如果系统中的各种操作都依赖于中心服务器上的元数据,那么中心服务器很容易成 ...

  8. deepin 常见快捷键及常用命令

    常用命令 1)安装软件命令行:dpkg -i <.deb file name>示例:dpkg -i avg71flm_r28-1_i386.deb2)安装一个目录下面所有的软件包命令行:d ...

  9. SpringMVC 向页面传值-Map、Model和ModelMap

    除了使用ModelAndView方式外.还可以使用Map.Model和ModelMap来向前台页面传值 使用后面3种方式,都是在方法参数中,指定一个该类型的参数.例如: Java代码 @Request ...

  10. Spring的概述

    1 Spring是什么? Spring是分层的Java SE/EE应用的full-stack的轻量级开源框架,以IOC(控制反转)和AOP(面向切面编程)为内核,提供了展现层SpringMVC和持久层 ...