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

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

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. Visual C++内存泄露检测—VLD工具使用说明

    一.        VLD工具概述 Visual Leak Detector(VLD)是一款用于Visual C++的免费的内存泄露检测工具.他的特点有:可以得到内存泄漏点的调用堆栈,如果可以的话,还 ...

  2. [转] weak_ptr解决shared_ptr环状引用所引起的内存泄漏

    http://blog.csdn.net/liuzhi1218/article/details/6993135 循环引用: 引用计数是一种便利的内存管理机制,但它有一个很大的缺点,那就是不能管理循环引 ...

  3. 【教训】rm -fr ./* 教训

    昨晚犯了一个重大错误,运行了 rm -rf ./* 本来是要删除一个不重要的目录的,结果在它的父目录下运行了上面命令,结果...都没了... 幸好数据库文件没有被删掉,数据还在,网站程序被删掉了,不久 ...

  4. HTML5之选择上传图片文件

  5. oracle的sql优化

    http://www.cnblogs.com/rootq/archive/2008/11/17/1334727.html

  6. ButterKnife 注解

    简介 官网:http://jakewharton.github.io/butterknife/ github:https://github.com/JakeWharton/butterknife 依赖 ...

  7. OD: Kernel Exploit - 1

    第 22 章,内核漏洞利用技术 首先编写具有漏洞的驱动 exploitme.sys,再展开内核漏洞利用思路和方法: /***************************************** ...

  8. win7 打开方式不能添加程序

    打开注册表,找到“HKEY_CLASSES_ROOT\Applications\”中,查看相应的程序的“\shell\open\command”项中的数据是否正确:如果不正确,就修改正确,之后再添加程 ...

  9. CSS before和after伪元素

    CSS中有一个特性允许我们添加额外元素而不扰乱文档本身,它们是以CSS选择器的形式出现的,具有标签的表现效果,但是呢又不是真正的标签元素,所以叫做“伪元素”.下面就说一下常见的两个伪元素before和 ...

  10. My.Ioc 代码示例——Lifetime 和 ILifetimeScope

    很多 Ioc 框架在创建对象的过程中,都会采取某种方式来缓存/复用/释放已构建的对象.在 My.Ioc 中,这个目的是通过 Lifetime/ILifetimeScope 来实现的.其中,Lifeti ...