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. Anaconda3+python3环境下如何创建python2环境(win+Linux下适用,同一个anaconda下py2/3共存)

    本人之前已经在anaconda环境下已经安装了python3的环境,现在因为一些需求,要安装python2环境 1.打开anaconda的anaconda prompt查看当前环境: conda in ...

  2. SVC 工作过程中出现的错误记录(SEO项目)

    1.同一のキーを含む項目が既に追加されています.追加的项目中含有重复主键) /seo' アプリケーションでサーバー エラーが発生しました. 同一のキーを含む項目が既に追加されています. 説明: 現在の ...

  3. 关于分布式存储系统中-CAP原则(CAP定理)与BASE理论比较

    CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性). Availability(可用性).Partition tolerance(分区容错性),三者不可得兼. CA ...

  4. TCP/IP详解(整理)

    1.概述 路由器是在网络层进行联通,而网桥是在链路层联通不同的网络. IP层用ICMP来与其他主机或路由器交换错误报文和其他的重要信息.应用程序也可以访问ICMP,两个诊断工具:Ping和Tracer ...

  5. URL的井号

    2010年9月,twitter改版. 一个显著变化,就是URL加入了"#!"符号.比如,改版前的用户主页网址为 http://twitter.com/username 改版后,就变 ...

  6. java基础81 jsp的内置对象(网页知识)

    1.什么是内置对象? 在jsp开发中,会频繁使用到一些对象,如:HttpSession,ServletContext,HttpServletRequest.      如果每次使用这些对象时,都要去创 ...

  7. 接口测试工具--Poster与Postman的简单实用

    HTTP/SOAP协议接口的功能测试: 1.浏览器URL(GET请求) http://127.0.0.1:8000/login/?username=zhangsan&password=1234 ...

  8. NopCommerce 执行计划任务不同Services协调操作导致更新数据失败的问题!

    问题描述: 在Nop的计划任务里需要两个任务协调操作 _shipmentService.InsertShipment(shipment); _orderProcessingService.Ship(s ...

  9. XML&反射

    本节内容: XML DTD约束 Schema约束 dom4j解析 反射 为了实现访问不同路径(/hello)执行不同的资源(HelloMyServlet),我们需要使用XML进行配置:为了限定XML内 ...

  10. 《精通Python设计模式》学习之原型模式

    暂时在工作中,还没有用到呢~~~ 以后要留意一下,主要用于复制对象副本, 然后又有自定义属性的地方. import copy from collections import OrderedDict c ...