Java 中的浮点数取精度方法
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 中的浮点数取精度方法的更多相关文章
- JAVA中使用浮点数类型计算时,计算精度的问题
标题 在Java中实现浮点数的精确计算 AYellow(原作) 修改 关键字 Java 浮点数 精确计算 问题的提出:如果我们编译运行下面这个程序会看到什么?publi ...
- Java中的BigDecimal类精度问题
bigdecimal 能保证精度的原理是:BigDecimal的解决方案就是,不使用二进制,而是使用十进制(BigInteger)+小数点位置(scale)来表示小数,就是把所有的小数变成整数,记录小 ...
- Java中的equals和hashCode方法
本文转载自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要 ...
- Java中的equals和hashCode方法详解
Java中的equals和hashCode方法详解 转自 https://www.cnblogs.com/crazylqy/category/655181.html 参考:http://blog.c ...
- 转:Java中的equals和hashCode方法详解
转自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这 ...
- 关于java中的hashcode和equals方法原理
关于java中的hashcode和equals方法原理 1.介绍 java编程思想和很多资料都会对自定义javabean要求必须重写hashcode和equals方法,但并没有清晰给出为何重写此两个方 ...
- Java中的栈,堆,方法区和常量池
要说Java中的栈,堆,方法区和常量池就要提到HotSpot,HotSpot是Sun JDK 和 Open JDK中所带的虚拟机. (Sun JDK 和 Open JDK除了注释不同,代码实现基本上是 ...
- Java 中extends与implements使用方法
Java 中extends与implements使用方法 标签: javaclassinterfacestring语言c 2011-04-14 14:57 33314人阅读 评论(7) 收藏 举报 分 ...
- Java中各种(类、方法、属性)访问修饰符与修饰符的说明
类: 访问修饰符 修饰符 class 类名称 extends 父类名称 implement 接口名称 (访问修饰符与修饰符的位置可以互换) 访问修饰符 名称 说明 备注 public 可以被本项目的所 ...
随机推荐
- Css之备忘录~
1.background-size:contain/cover 两者的作用都是一样,一般用于设置小图标作为背景图,两者的区别是: Contain:不会失真 cover:会失真 2.a标签里面如 ...
- Java设计模式——工厂模式
一.工厂模式分类 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类: (1)简单工厂模式(Simp ...
- Linux压缩打包方法连载之三:bzip2, bzcat 命令
Linux压缩打包方法有多种,本文集中讲解了bzip2, bzcat 命令的使用.案例说明,例如# 与 gzip 同样的,都是在计算压缩比的参数,-9 最佳,-1 最快. AD: 我们遇见Linux压 ...
- linux快速安装mysql教程
#安装mysql服务器:yum install mysql-server #设置开机启动chkconfig mysqld on#现在启动服务service mysqld start #设置root初始 ...
- python网络编程--进程池
一:进程池 进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程, 如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止. 进程池中有两个方法: apply a ...
- python网络编程--线程event
一:线程event作用 Python提供了Event对象用于线程间通信,它是线程设置的信号标志,如果信号标志位真,则其他线程等待直到信号结束. Event对象实现了简单的线程通信机制,它提供了设置信号 ...
- Python的set集合详解
Python 还包含了一个数据类型 -- set (集合).集合是一个无序不重复元素的集.基本功能包括关系测试和消除重复元素.集合对象还支持 union(联合),intersection(交),dif ...
- jmeter之数据库
https://www.cnblogs.com/ShadowXie/p/6007515.html
- win10 操作配置备忘
让程序自动启动 如果想要实现应用程序在所有的用户登录系统后都能自动启动,就把该应用程序的快捷方式放到"系统启动文件夹"里: C:\ProgramData\Microsoft\Win ...
- Linux下的输入/输出重定向
Linux环境中支持输入输出重定向,用符号<和>来表示.0.1和2分别表示标准输入.标准输出和标准错误信息输出,可以用来指定需要重定向的标准输入或输出,比如 2>lee.dat 表示 ...