java四舍五入及注意点
- package com.example.newtest.test;
- import java.math.BigDecimal;
- import java.math.RoundingMode;
- import java.text.DecimalFormat;
- import java.text.NumberFormat;
- public class DoubleTest {
- /**
- * Math.round()
- *
- * @param d
- * @return
- */
- public static double formatDouble1(double d) {
- return (double) Math.round(d * 100) / 100;
- }
- /**
- * new BigDecimal().setScale()
- *
- * @param d
- * @return
- */
- public static double formatDouble2(double d) {
- // 旧方法,已经不再推荐使用
- // BigDecimal bg = new BigDecimal(d).setScale(2, BigDecimal.ROUND_HALF_UP);
- // 新方法,如果不需要四舍五入,可以使用RoundingMode.DOWN
- BigDecimal bg = new BigDecimal(d).setScale(2, RoundingMode.UP);
- return bg.doubleValue();
- }
- /**
- * NumberFormat().format()
- *
- * @param d
- * @return
- */
- public static String formatDouble3(double d) {
- NumberFormat nf = NumberFormat.getNumberInstance();
- // 保留两位小数
- nf.setMaximumFractionDigits(2);
- // 如果不需要四舍五入,可以使用RoundingMode.DOWN
- nf.setRoundingMode(RoundingMode.UP);
- return nf.format(d);
- }
- /**
- * DecimalFormat().format
- *
- * @param d
- * @return
- */
- public static String formatDouble4(Double d) {
- //0表示如果该位置的数值无论大于0还是等于0都要显示占位;#表示如果该位置的数值大于0显示数值,如果等于0则不显示.
- //DecimalFormat("0.#0")这种情况下会抛异常
- //解读:#.00 表示两位小数 #.0000四位小数 以此类推…
- DecimalFormat df = new DecimalFormat("#.00");
- df.setRoundingMode(RoundingMode.HALF_UP); //默认是HALF_EVEN
- String res;
- res = df.format(new BigDecimal(d)); //18.14
- res = df.format(new BigDecimal(d.toString())); //18.15
- res = df.format(BigDecimal.valueOf(d)); //18.15
- //运行以上代码可以看到,结果是不一样的
- //原因: 使用参数为float或double的BigDecimal创建对象会丢失精度,因此不要使用参数为float或double的BigDecimal创建对象
- //解决办法:
- //使用BigDecimal(String val)的构造方法创建对象
- //使用使用BigDecimal的valueOf(double val)方法创建对象
- return res;
- }
- /**
- * String.format()格式化输出
- * 解读: %.2f 中 %. 表示 小数点前任意位数 2 表示两位小数 格式后的结果为f 表示浮点型。
- * @param d
- * @return
- */
- public static String formatDouble5(double d) {
- return String.format("%.2f", d);
- }
- public static void main(String[] args) {
- double d = 18.145;
- System.out.println(formatDouble1(d));
- System.out.println(formatDouble2(d));
- System.out.println(formatDouble3(d));
- System.out.println(formatDouble4(d));
- System.out.println(formatDouble5(d));
- }
- }
补充: BigDecimal.ROUND_HALF_XXX的各种用法
- 在银行、帐户、计费等领域,BigDecimal提供了精确的数值计算。其中8种舍入方式值得掌握。
- 1、ROUND_UP
- 舍入远离零的舍入模式。
- 在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。
- 注意,此舍入模式始终不会减少计算值的大小。
- 2、ROUND_DOWN
- 接近零的舍入模式。
- 在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。
- 注意,此舍入模式始终不会增加计算值的大小。
- 3、ROUND_CEILING
- 接近正无穷大的舍入模式。
- 如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;
- 如果为负,则舍入行为与 ROUND_DOWN 相同。
- 注意,此舍入模式始终不会减少计算值。
- 4、ROUND_FLOOR
- 接近负无穷大的舍入模式。
- 如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;
- 如果为负,则舍入行为与 ROUND_UP 相同。
- 注意,此舍入模式始终不会增加计算值。
- 5、ROUND_HALF_UP
- 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。
- 如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。
- 注意,这是我们大多数人在小学时就学过的舍入模式(四舍五入)。
- 6、ROUND_HALF_DOWN
- 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
- 如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。
- 7、ROUND_HALF_EVEN 银行家舍入法
- 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
- 如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;
- 如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。
- 注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。
- 此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。
- 如果前一位为奇数,则入位,否则舍去。
- 以下例子为保留小数点1位,那么这种舍入方式下的结果。
- 1.15>1.2 1.25>1.2
- 8、ROUND_UNNECESSARY
- 断言请求的操作具有精确的结果,因此不需要舍入。
- 如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。
- 因为我们是属于互联网金融行业,所有在进行计算的时候尽量使用ROUND_HALF_EVEN 银行家舍入法
java四舍五入及注意点的更多相关文章
- 【转】java取整和java四舍五入方法
java取整和java四舍五入方法 import java.math.BigDecimal; import java.text.DecimalFormat; public class TestGetI ...
- java四舍五入BigDecimal和js保留小数点两位
java四舍五入BigDecimal保留两位小数的实现方法: // 四舍五入保留两位小数System.out.println("四舍五入取整:(3.856)=" + ne ...
- Java四舍五入 保留小数
java 四舍五入保留小数 // 方式一: double f = 3.1516; BigDecimal b = new BigDecimal(f); double f1 = b.setScale( ...
- java取整和java四舍五入方法 BigDecimal.setScale()方法详解
import java.math.BigDecimal; public class TestGetInt { public static void main(String[] args) { doub ...
- java取整和java四舍五入方法 转自董俊杰
import java.math.BigDecimal; import java.text.DecimalFormat; public class TestGetInt{ public static ...
- java四舍五入的取舍
一.保留2位小数,且四舍五入 String re = new java.text.DecimalFormat("#.##").format(3.14555); 结果:3.15 二. ...
- JAVA 四舍五入Math.round方法
今天由于测试场景,利息的计算中涉及小数点的保留.保留的规则是:两位小数+四舍五入方式 使用的语言是JAVA, 看了许多网上的方法.因为最后保留的小数还会进行计算.所以我考虑最好不要保留的结果是Stri ...
- java四舍五入
package com.clzhang.sample; import java.math.BigDecimal; import java.math.RoundingMode; import java. ...
- java四舍五入保留两位小数4种方法
4种方法,都是四舍五入,例: import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberF ...
随机推荐
- python子进程模块subprocess详解
subprocess--子进程管理器一.subprocess 模块简介subprocess最早是在2.4版本中引入的.subprocess模块用来生成子进程,并可以通过管道连接它们的输入/输出/错误, ...
- nodejs express 部署
一.express 4.x版本之前 全局安装express 命令是 npm install express -g express 4.x版本之后 全局安装express 命令是 npm install ...
- 一、Signalr WebApi客服-客户链接+Redis
一.前端客服代码 <!doctype html> <html> <head> <meta charset="utf-8"> < ...
- js 一些小技巧
Javascript 中的 绑定事件 on $(document).on("事件","元素","方法"): Js 定时方法 1.setTim ...
- yum 安装mysql-server 5.6
# rpm ivh http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm # yum install -y mysql-s ...
- SpringFramework中的BeanWrapper丶PropertyEditor
BeanWrapper是org.springframework.beans包下的一个借口,对应的实现类为BeanWrapperImpl,提供对应的get/set方法,并且设置属性的可读性和可写性. p ...
- 什么是lease机制?
分布式系统理论之租约机制学习 一,租约机制介绍 在分布式系统中,往往会有一个中心服务器节点.该节点负责存储.维护系统中的元数据.如果系统中的各种操作都依赖于中心服务器上的元数据,那么中心服务器很容易成 ...
- deepin 常见快捷键及常用命令
常用命令 1)安装软件命令行:dpkg -i <.deb file name>示例:dpkg -i avg71flm_r28-1_i386.deb2)安装一个目录下面所有的软件包命令行:d ...
- SpringMVC 向页面传值-Map、Model和ModelMap
除了使用ModelAndView方式外.还可以使用Map.Model和ModelMap来向前台页面传值 使用后面3种方式,都是在方法参数中,指定一个该类型的参数.例如: Java代码 @Request ...
- Spring的概述
1 Spring是什么? Spring是分层的Java SE/EE应用的full-stack的轻量级开源框架,以IOC(控制反转)和AOP(面向切面编程)为内核,提供了展现层SpringMVC和持久层 ...