Java 中的浮点数取精度方法

一、内容

  一般在Java代码中取一个double类型的浮点数的精度,四舍五入或者直接舍去等的方式,使用了4种方法,推荐使用第一种,我已经封装成工具类了。

二、代码实现

   ①使用BigDecimal的方法:RoundTool.java(封装为工具类,推荐使用)

 package cn.com.cxsw.utils;

 import java.math.BigDecimal;

 /**
* 与小数位精度(四舍五入等)相关的一些常用工具方法.
*
* float/double的精度取值方式分为以下几种: <br>
* java.math.BigDecimal.ROUND_UP <br>
* java.math.BigDecimal.ROUND_DOWN <br>
* java.math.BigDecimal.ROUND_CEILING <br>
* java.math.BigDecimal.ROUND_FLOOR <br>
* java.math.BigDecimal.ROUND_HALF_UP<br>
* java.math.BigDecimal.ROUND_HALF_DOWN <br>
* java.math.BigDecimal.ROUND_HALF_EVEN <br>
*
* @title RoundTool
* @describe
* @author zfc
* @date 2017年10月25日上午11:18:47
*/ public final class RoundTool {
/**
* 对double数据进行取精度.
* <p>
* For example: <br>
* double value = 100.345678; <br>
* double ret = round(value,4,BigDecimal.ROUND_HALF_UP); <br>
* ret为100.3457 <br>
*
* @param value
* double数据.
* @param scale
* 精度位数(保留的小数位数).
* @param roundingMode
* 精度取值方式.
* @return 精度计算后的数据.
*/
public static double round(double value, int scale, int roundingMode) {
BigDecimal bd = new BigDecimal(value);
bd = bd.setScale(scale, roundingMode);
double d = bd.doubleValue();
bd = null;
return d;
} /**
* 测试用的main方法.
*
* @param argc
* 运行参数.
*
*/
public static void main(String[] argc) {
// 下面都以保留2位小数为例 // ROUND_UP
// 只要第2位后面存在大于0的小数,则第2位就+1
System.out.println(round(12.3401, 2, BigDecimal.ROUND_UP));// 12.35
System.out.println(round(-12.3401, 2, BigDecimal.ROUND_UP));// -12.35 // ROUND_DOWN
// 与ROUND_UP相反
// 直接舍弃第2位后面的所有小数
System.out.println(round(12.349, 2, BigDecimal.ROUND_DOWN));// 12.34
System.out.println(round(-12.349, 2, BigDecimal.ROUND_DOWN));// -12.34 // ROUND_CEILING
// 如果数字>0 则和ROUND_UP作用一样
// 如果数字<0 则和ROUND_DOWN作用一样
System.out.println(round(12.3401, 2, BigDecimal.ROUND_CEILING));// 12.35
System.out.println(round(-12.349, 2, BigDecimal.ROUND_CEILING));// -12.34 // ROUND_FLOOR
// 如果数字>0 则和ROUND_DOWN作用一样
// 如果数字<0 则和ROUND_UP作用一样
System.out.println(round(12.349, 2, BigDecimal.ROUND_FLOOR));// 12.34
System.out.println(round(-12.3401, 2, BigDecimal.ROUND_FLOOR));// -12.35 // ROUND_HALF_UP [这种方法最常用,四舍五入]
// 如果第3位数字>=5,则第2位数字+1
// 备注:只看第3位数字的值,不会考虑第3位之后的小数的
System.out.println(round(12.345, 2, BigDecimal.ROUND_HALF_UP));// 12.35
System.out.println(round(12.3449, 2, BigDecimal.ROUND_HALF_UP));// 12.34
System.out.println(round(-12.345, 2, BigDecimal.ROUND_HALF_UP));// -12.35
System.out.println(round(-12.3449, 2, BigDecimal.ROUND_HALF_UP));// -12.34 // ROUND_HALF_DOWN
// 如果第3位数字>=5,则做ROUND_UP
// 如果第3位数字<5,则做ROUND_DOWN
System.out.println(round(12.345, 2, BigDecimal.ROUND_HALF_DOWN));// 12.35
System.out.println(round(12.3449, 2, BigDecimal.ROUND_HALF_DOWN));// 12.34
System.out.println(round(-12.345, 2, BigDecimal.ROUND_HALF_DOWN));// -12.35
System.out.println(round(-12.3449, 2, BigDecimal.ROUND_HALF_DOWN));// -12.34 // ROUND_HALF_EVEN
// 如果第3位是偶数,则做ROUND_HALF_DOWN
// 如果第3位是奇数,则做ROUND_HALF_UP
System.out.println(round(12.346, 2, BigDecimal.ROUND_HALF_EVEN));// 12.35
System.out.println(round(12.345, 2, BigDecimal.ROUND_HALF_EVEN));// 12.35 } }

 ②一些简单的方法:DoubleNumberFormat.java

 package cn.com.zfc.example;

 import java.text.DecimalFormat;
import java.text.NumberFormat; /**
* double类型的浮点数取精度(以保留两位小数为例)
*
* @author zfc
*
*/
public class DoubleNumberFormat {
public static void main(String[] args) {
double num = 1234.123534;
// 1、使用String的format()方法
System.out.println(num + " 保留两位小数:" + String.format("%.2f", num)); // 2、使用DecimalFormat的format()方法
DecimalFormat decimalFormat = new DecimalFormat("#.00");
System.out.println(num + " 保留两位小数:" + decimalFormat.format(num)); // 3、使用NumberFormat的format()方法
NumberFormat numberFormat = NumberFormat.getNumberInstance();
numberFormat.setMaximumFractionDigits(2);
System.out.println(num + " 保留两位小数:" + numberFormat.format(num));
}
}

Java 中的浮点数取精度方法的更多相关文章

  1. JAVA中使用浮点数类型计算时,计算精度的问题

    标题     在Java中实现浮点数的精确计算    AYellow(原作) 修改    关键字     Java 浮点数 精确计算   问题的提出:如果我们编译运行下面这个程序会看到什么?publi ...

  2. Java中的BigDecimal类精度问题

    bigdecimal 能保证精度的原理是:BigDecimal的解决方案就是,不使用二进制,而是使用十进制(BigInteger)+小数点位置(scale)来表示小数,就是把所有的小数变成整数,记录小 ...

  3. Java中的equals和hashCode方法

    本文转载自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要 ...

  4. Java中的equals和hashCode方法详解

    Java中的equals和hashCode方法详解  转自 https://www.cnblogs.com/crazylqy/category/655181.html 参考:http://blog.c ...

  5. 转:Java中的equals和hashCode方法详解

    转自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这 ...

  6. 关于java中的hashcode和equals方法原理

    关于java中的hashcode和equals方法原理 1.介绍 java编程思想和很多资料都会对自定义javabean要求必须重写hashcode和equals方法,但并没有清晰给出为何重写此两个方 ...

  7. Java中的栈,堆,方法区和常量池

    要说Java中的栈,堆,方法区和常量池就要提到HotSpot,HotSpot是Sun JDK 和 Open JDK中所带的虚拟机. (Sun JDK 和 Open JDK除了注释不同,代码实现基本上是 ...

  8. Java 中extends与implements使用方法

    Java 中extends与implements使用方法 标签: javaclassinterfacestring语言c 2011-04-14 14:57 33314人阅读 评论(7) 收藏 举报 分 ...

  9. Java中各种(类、方法、属性)访问修饰符与修饰符的说明

    类: 访问修饰符 修饰符 class 类名称 extends 父类名称 implement 接口名称 (访问修饰符与修饰符的位置可以互换) 访问修饰符 名称 说明 备注 public 可以被本项目的所 ...

随机推荐

  1. c# 生成随机N位数字串(每位可以重复)

    /// <summary> /// 生成随机数字窜 /// </summary> /// <param name="Digit">位数</ ...

  2. 网络流建图(典型)(EK)

    题目链接:https://cn.vjudge.net/contest/68128#problem/B 具体思路: 按照  源点 - > 食物 - > 牛1 - > 牛2 - > ...

  3. python进阶之函数和类内建魔法属性

    前言 关于对象的魔法方法我们已经讲得太多,但是对于类或函数内建的魔法属性和功能我们涉及较少,下面系统了解一下类和函数的内建属性. 查看内建属性 class Person(object): pass d ...

  4. 通过PDB文件实现非嵌入式的c++反射

    上一篇blog我阐述了一种实现非嵌入式的反射的基本思路.相比于通过宏和模板实现,这种非嵌入的反射的优点是不需要写额外的代码来记录meta信息. 首先,为了在c++中实现反射系统,我认为需要解决以下两个 ...

  5. InfluxDB系列之一安装及简单运维(未完成,需要继续写)

    InfluxDB 是一个开源分布式时序.事件和指标数据库.使用 Go 语言编写,无需外部依赖.其设计目标是实现分布式和水平伸缩扩展. 它有三大特性: 1. Time Series (时间序列):你可以 ...

  6. Ibatis.Net 各种配置说明学习(二)

    1.各个配置文件的配置说明 providers.config:指定数据库提供者,.Net版本等信息. xxxxx.xml:映射规则. SqlMap.config:大部分配置一般都在这里,如数据库连接等 ...

  7. Java 中 日期 时间 加减

    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //方法1(推荐,功能强大灵活多变) Ca ...

  8. 聚类:(K-means)算法

    1.归类: 聚类(clustering) 属于非监督学习 (unsupervised learning) 无类别标记(class label) 2.举例: 3. K-means 算法:         ...

  9. 怎么能让json_decode解析带斜杠的字符串

    比如前台一个js object:{  aa: "cc\dd"}$d = '{\"aa\": \"cc\\dd\"}';这时候用 json_d ...

  10. 在Kubernetes上使用Traefik

    本节内容: Traefik介绍 部署测试用的两个服务 Role Based Access Control configuration (Kubernetes 1.6+ only) 部署Traefik ...