JAVA正确的四舍五入方法
在JDK版本为1.8的情况运行下面的代码,会发现很神奇的情况(见运行结果)。
看如下代码:
package com.longge.mytest; import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat; import org.junit.Test; public class TestDecimal {
@Test
public void test() {
BigDecimal a = new BigDecimal(0.075);
BigDecimal a1 = new BigDecimal(10.075);
BigDecimal a2 = new BigDecimal(100.075); BigDecimal b = new BigDecimal(0.074);
BigDecimal b1 = new BigDecimal(10.074);
BigDecimal b2 = new BigDecimal(100.074); BigDecimal c = new BigDecimal("0.075");
BigDecimal c1 = new BigDecimal("10.075");
BigDecimal c2 = new BigDecimal("100.075"); DecimalFormat df = new DecimalFormat("#0.00"); BigDecimal one = BigDecimal.ONE; // 0.07
System.out.println(a.divide(one, 2, RoundingMode.HALF_UP).doubleValue());
// 0.08
System.out.println(a.divide(one).add(new BigDecimal("0.0000000001")).setScale(2, RoundingMode.HALF_UP).doubleValue());
// 0.07
System.out.println(b.divide(one, 2, RoundingMode.HALF_UP).doubleValue());
// 0.07
System.out.println(b.divide(one).add(new BigDecimal("0.0000000001")).setScale(2, RoundingMode.HALF_UP).doubleValue());
// 0.07
System.out.println(df.format(0.074));
// 0.07
System.out.println(df.format(0.075));
// 0.08
System.out.println(c.divide(one, 2, RoundingMode.HALF_UP).doubleValue()); System.out.println("----------------------------"); // 10.07
System.out.println(a1.divide(one, 2, RoundingMode.HALF_UP).doubleValue());
// 10.08
System.out.println(a1.divide(one).add(new BigDecimal("0.0000000001")).setScale(2, RoundingMode.HALF_UP).doubleValue());
// 10.7
System.out.println(b1.divide(one, 2, RoundingMode.HALF_UP).doubleValue());
// 10.07
System.out.println(b1.divide(one).add(new BigDecimal("0.0000000001")).setScale(2, RoundingMode.HALF_UP).doubleValue());
// 10.07
System.out.println(df.format(10.074));
// 10.07
System.out.println(df.format(10.075));
// 10.08
System.out.println(c1.divide(one, 2, RoundingMode.HALF_UP).doubleValue()); System.out.println("----------------------------"); // 100.08
System.out.println(a2.divide(one, 2, RoundingMode.HALF_UP).doubleValue());
// 100.08
System.out.println(a2.divide(one).add(new BigDecimal("0.0000000001")).setScale(2, RoundingMode.HALF_UP).doubleValue());
// 100.07
System.out.println(b2.divide(one, 2, RoundingMode.HALF_UP).doubleValue());
// 100.07
System.out.println(b2.divide(one).add(new BigDecimal("0.0000000001")).setScale(2, RoundingMode.HALF_UP).doubleValue());
// 100.07
System.out.println(df.format(100.074));
// 100.08
System.out.println(df.format(100.075));
// 100.08
System.out.println(c2.divide(one, 2, RoundingMode.HALF_UP).doubleValue());
}
}
运行结果如下:
0.07
0.08
0.07
0.07
0.07
0.07
0.08
----------------------------
10.07
10.08
10.07
10.07
10.07
10.07
10.08
----------------------------
100.08
100.08
100.07
100.07
100.07
100.08
100.08
其中可选模式有:
1、 ROUND_UP:远离零方向舍入。向绝对值最大的方向舍入,只要舍弃位非0即进位。
2、 ROUND_DOWN:趋向零方向舍入。向绝对值最小的方向输入,所有的位都要舍弃,不存在进位情况。
3、 ROUND_CEILING:向正无穷方向舍入。向正最大方向靠拢。若是正数,舍入行为类似于ROUND_UP,若为负数,舍入行为类似于ROUND_DOWN。Math.round()方法就是使用的此模式。
4、 ROUND_FLOOR:向负无穷方向舍入。向负无穷方向靠拢。若是正数,舍入行为类似于ROUND_DOWN;若为负数,舍入行为类似于ROUND_UP。
5、 HALF_UP:最近数字舍入(5进)。这是我们最经典的四舍五入。
6、 HALF_DOWN:最近数字舍入(5舍)。在这里5是要舍弃的。
7、 HAIL_EVEN:银行家舍入法。
查看JDK的官方说明:

所以在做对精度要求高的计算时,要将double/float转成字符串后再转成BigDecimal进行计算
JAVA正确的四舍五入方法的更多相关文章
- 【转】java取整和java四舍五入方法
java取整和java四舍五入方法 import java.math.BigDecimal; import java.text.DecimalFormat; public class TestGetI ...
- Java中的main()方法详解
在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是 ...
- 如何在Java中避免equals方法的隐藏陷阱
摘要 本文描述重载equals方法的技术,这种技术即使是具现类的子类增加了字段也能保证equal语义的正确性. 在<Effective Java>的第8项中,Josh Bloch描述了当继 ...
- 用javah 导出类的头文件, 常见的错误及正确的使用方法
******************************************************************************** 用javah 导出类的头文件, 常见的 ...
- 对java中的equals()方法的总结
Java的基础学习总结--equals方法 一,等于方法介绍 1.1.通过下面的例子掌握等于的用法 1 package cn.galc.test; 2 3 public class TestEqual ...
- The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 解决方法
项目忽然出现 The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Pat ...
- 两种计算Java对象大小的方法
之前想研究一下unsafe类,碰巧在网上看到了这篇文章,觉得写得很好,就转载过来.原文出处是: http://blog.csdn.net/iter_zc/article/details/4182271 ...
- Eclipse、MinGW、JNI编写C++生成dll, Java端调用的完整示例(附java.lang.UnsatisfiedLinkError解决方法)
Eclipse.MinGW.JNI编写C++生成dll, Java端调用的完整示例(附java.lang.UnsatisfiedLinkError解决方法) 问题背景:之前的JNI编程都是基于And ...
- 获取当前应用的系统路径工具类和java的System.getProperty()方法介绍
java的System.getProperty()方法可以获取的值,如下: 对于Java程序,无论是未打包的还是打包的JAR或WAR文件,有时候都需要获取它运行所在目录信息,如何做到这一点呢? /** ...
随机推荐
- pkg-config原理及用法
原文 https://blog.csdn.net/luotuo44/article/details/24836901 我们在用第三方库的时候,经常会用到pkg-config这个东西来编译程序.那pk ...
- C/C++ 关于 for循环 的第二个表达式右侧非常量的时候
废话不多说,直接看代码: #include<stdio.h> int main(){ ; ;z<zmax;z++){ printf("i=%d z=%d\n",i ...
- Swift3.0:照片选择
一.介绍 图片选择或者拍照功能: 1.选择相册中的图片或是拍照,都是通过UIImagePickerController控制器实例化一个对象,然后通过self.presentViewController ...
- QT - 内存泄漏检测
一.安装vld-2.5.1-setup.exe 下载地址:https://archive.codeplex.com/?p=vld 二.pro中添加头文件目录与库目录 INCLUDEPATH += &q ...
- tensorflow 之tf.nn.depthwise_conv2d and separable_conv2d实现及原理
Depthwise Separable Convolution 1.简介 Depthwise Separable Convolution 是谷歌公司于2017年的CVPR中在论文”Xception: ...
- 【Spark】SparkStreaming-foreachrdd foreachpartition
SparkStreaming-foreachrdd foreachpartition foreachrdd foreachpartition_百度搜索 SparkStreaming之foreachRD ...
- Spring(十八):Spring AOP(二):通知(前置、后置、返回、异常、环绕)
AspectJ支持5种类型的通知注解: @Before:前置通知,在方法执行之前执行: @After:后置通知,在方法执行之后执行: @AfterRunning:返回通知,在方法返回结果之后执行(因此 ...
- wifidog 源码初分析(3)-转
上一篇分析了 接入设备 在接入路由器,并发起首次 HTTP/80 请求到路由器上时,wifidog 是如何将此 HTTP 请求重定向至 auth-server 的流程. 之后 接入设备 的浏览器接收到 ...
- Eclipse技术: 项目文件中过滤.o文件
1. 右建项目 -> Properties. 2. 增加过滤规则
- 如何查看自己电脑系统的安装日期-Window上
开始 > 运行(快捷键 Win+R)->敲入 systeminfo | find “初始安装日期”