在实际项目开发中,经常会存在浮点数四舍五入保留几位小数的问题,故收集了几种常用方法:

直接上代码(保留两位小数)。

Format.java:

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat; class Format {
private double src_num; public Format(double num){
src_num = num;
} /*
* BigDecimal,数字构造
*/
public void fun1() {
BigDecimal bg = new BigDecimal(src_num);
//数字2代表保留两位
double des_num = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.println(des_num);
} /*
* BigDecimal,字符串构造
*/
public void fun2() {
BigDecimal bg = new BigDecimal(String.valueOf(src_num));
//数字2代表保留两位
double des_num = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.println(des_num);
} /*
* DecimalFormat
*/
public void fun3() {
//#.00 表示两位小数 ,#.0000四位小数 以此类推...
DecimalFormat df = new DecimalFormat("#.00");
System.out.println(df.format(src_num));
} /*
* String.format
*/
public void fun4() {
//%. 表示 小数点前任意位数,2 表示两位小数,格式后的结果为f 表示浮点型
System.out.println(String.format("%.2f", src_num));
} /*
* NumberFormat
*/
public void fun5() {
NumberFormat nf = NumberFormat.getNumberInstance();
//2为格式化对象设定小数点后的显示的最多位,显示的最后位是舍入的
nf.setMaximumFractionDigits(2);
System.out.println(nf.format(src_num));
} /*
* Math.round
*/
public void fun6() {
double des_num = (double)Math.round(src_num * 100) / 100;
System.out.println(des_num);
}
}

TestDemo.java:

public class TestDemo {
public static void main(String[] args) {
double num = 3.1415926;
//double num = 4.015;
//double num = 4.016;
//double num = 999999999.015;
Format format = new Format(num);
format.fun1();
format.fun2();
format.fun3();
format.fun4();
format.fun5();
format.fun6();
}
}

让我们看下运行结果:

3.1415926

3.14
3.14
3.14
3.14
3.14
3.14

4.015:

4.01
4.02
4.01
4.02
4.01
4.01

4.016:

4.02
4.02
4.02
4.02
4.02
4.02

999999999.015:

9.9999999901E8
9.9999999902E8
999999999.01
999999999.02
999,999,999.01
9.9999999902E8

普通开发中,对计算精度要求不算太严格的话,上面的方法都适用(科学计数法转换的话会比较繁琐)。

但对于一些精度要求较高的商业运算,误差0.01就可能造成比较大的问题。
产生上述问题的原因还是在于浮点数在计算机中本来就是不精确的,参考:http://justjavac.iteye.com/blog/1073775

从上述结果中,可以看出fun2()和fun4()是始终OK的。

因此推荐两种方式进行浮点数小数位数保留:

①BigDecimal,字符串构造

②String.format转换

Java 保留两位小数的更多相关文章

  1. java使double保留两位小数的多方法 java保留两位小数

    这篇文章主要介绍了java使double类型保留两位小数的方法,大家参考使用吧 复制代码 代码如下: mport java.text.DecimalFormat; DecimalFormat    d ...

  2. java保留两位小数

    java保留两位小数问题: 方式一: 四舍五入  double   f   =   111231.5585;  BigDecimal   b   =   new   BigDecimal(f);  d ...

  3. java保留两位小数和js保留两位小数一致性研究

    一.java保留两位小数方式 public static void main(String[] args) { System.out.println("=======DecimalForma ...

  4. Java保留两位小数的几种做法

    1.  String类型数字始终保留两位小数 , RoundingMode.HALF_UP); return bd.toString(); } /** * 使用DecimalFormat,保留小数点后 ...

  5. java保留两位小数4种方法(转载)

    喵喵最近经常遇到小数点保留的问题,转载一篇Java里面的几种小数点位数控制方法. 这是转载的原地址:https://www.cnblogs.com/chenrenshui/p/6128444.html ...

  6. java保留两位小数4种方法

    import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; public c ...

  7. java保留两位小数的方法

    01.import java.math.BigDecimal; 02.import java.text.DecimalFormat; 03.import java.text.NumberFormat; ...

  8. JAVA 保留两位小数的四种方法

    import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; publiccl ...

  9. java保留两位小数(不四舍五入)

    import java.text.DecimalFormat; import java.math.RoundingMode; class Text{ public static void main(S ...

随机推荐

  1. sl4j记录

  2. Android WebView Error – Uncaught TypeError: Cannot call method ‘getItem’ of null at

    本质原因是js 没有判断dom 是否加载完毕 其实就是在dom 加载完毕之后处理事件 wv.getSettings().setDomStorageEnabled(true); 转自 蛙齋  http: ...

  3. WinForm(C#)CheckedlistBox绑定数据,并获得选中的值(ValueMember)和显示文本(DisplayMember)

    本文中我将和大家讨论关于在WinForm开发中给CheckedlistBox空间绑定数据源,并获取控件中选中的所有元素的显示文本(DisplayMember)和对应的实际值(ValueMember)的 ...

  4. [置顶] Oracle 11g R2 RAC:使用 srvctl 工具管理 service 资源

    1.使用 srvctl 工具创建 service 资源 srvctl add service -d db_unique_name -s service_name {-r "preferred ...

  5. Ubuntu server下安装JDK和Tomcat7

    服务器是Ubuntu server 12.04 LTS 64bit 所有操作假设已经有root权限,若没有需要添加sudo. 一. 安装JDK 1.去Oracle官网下载jdk-6u45-linux- ...

  6. JQ滑动导航菜单的实现

    前言:不多说直接看效果!!! 这样的菜单我们在一般的网站上见到的也比较多,有比较好的用户体验!   原理:这个很重要,任何的特效只要原理搞明白了,实现起来都是很容易的!这个特效的原理很简单,菜单的样式 ...

  7. PuTTY?Bash?Out了!!!终端应该这么玩~

    由于语言的障碍,国内一直存在一个问题,就是新技术引入太慢.比如PuTTY,其实已停止维护N久了,但大部分人却仍然在用(包括之前的我).比如Bash,明知有那么多的问题,却一直没有什么想法,似乎Linu ...

  8. Android 连接 SQL Server (jtds方式)——上

    本文将介绍开发Android程序,连接SQL Server,通过第三方包jtds的方式. 如果你有同样的需求,请跟着做一遍,博主将以最详细的方式,进行介绍. 首先说明,Java.Android连接SQ ...

  9. codevs 1282 约瑟夫问题(线段树)

    #include<iostream> #include<cstdio> #include<cstring> #define maxn 30010 using nam ...

  10. css居中技巧

    1    text-align: center; 只能对图片,按钮,文字等行内元素(display为inline或inline-block等)进行水平居中.在IE6.7中能对任何元素进行水平居中.另外 ...