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

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

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. 纠结的CLI C++与Native C++的交互

    最近在写点东西,涉及到了CLR C++与Native C++的互相调用的问题,结果...........纠结啊. 交互原型 交互原型是这样的: void* avio_alloc_context( un ...

  2. windows路由命令route

    route print 查看当前的路由信息 route add 10.0.0.0 mask 255.0.0.0 10.1.1.1 增加一条到10.0.0.0/8网络的路由,网关是10.1.1.1 ro ...

  3. 再看C++引用类型

    之前弃用博客园的原因是其不支持markdown语法.到今天偶然进来试了一下,发现Markdown toggle原来是能支持的(不知道是不是因为它升级了),遂重新启用. 在一年前学C++的时候就对引用, ...

  4. Ubuntu12.04安装hadoop

    1.      创建hadoop用户组和用户 a.  创建hadoop用户组 sudo addgroup hadoop b.  创建hadoop用户 sudo adduser –ingroup had ...

  5. jni java和C之间的值传递(int String int[])

    我们通过jni调用C代码不可能每次只是去调一个方法,通常,我们需要传递一些值过去. 例如,播放电影,那就肯定需要你把电影的 url给 C的播放器吧,等等. 接下来就看一看怎么去传递这些值: 首先是最简 ...

  6. slidingmenu+fragment实现经常使用的側滑效果(包含Fragment状态的保存)

    一.需求 关于fragment的问题,一直想写一篇博客了.应该当初自己也是对这玩意一点都不熟悉到如今也大概知道个日常的使用的地步. 一个側滑的导航栏,内有4个条目.每个选项点击进入相应的界面,每个界面 ...

  7. [Angular 2] Using Pipes to Filter Data

    Pipes allow you to change data inside of templates without having to worry about changing it in the ...

  8. MongoDB C++ 2.4.5 driver 编译安装问题

    安装参考前文,http://blog.csdn.net/sheismylife/article/details/8794589 方法一致.只不过这次在GCC4.8.1上编译. scons instal ...

  9. C++面试中string类的一种正确写法

    C++ 的一个常见面试题是让你实现一个 String 类,限于时间,不可能要求具备 std::string 的功能,但至少要求能正确管理资源.具体来说: 能像 int 类型那样定义变量,并且支持赋值. ...

  10. Linux开发工具之Makefile(上)

    二.makefile(上) 01.make工具   利用make工具可以自动完成编译工作.这些工作包括:如果修改了某几 个源文件,则只重装新编译这几个源文件:如果某个头文件被修改了,则 重新编译所有包 ...