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 可以被本项目的所 ...
随机推荐
- layui-laypage模块代码详解
/** layui-v2.4.0 MIT License By https://www.layui.com */;layui.define(function(e) { "use strict ...
- 树形dp(C - Choosing Capital for Treeland CodeForces - 219D )
题目链接:https://cn.vjudge.net/contest/277955#problem/C 题目大意:输入n,代表有n个城市,然后再输入n-1条有向边,然后让你找出一个改变边数的最小值,使 ...
- JDK1.8源码之String
一.String类型 引用博文连接: https://blog.csdn.net/ylyg050518/article/details/52352993 一.成员变量 //用于存储字符串 priva ...
- KVM,QEMU,libvirt入门学习笔记【转】
转自:http://blog.csdn.net/julykobe/article/details/27571387 注:本文内容均来自网络,我只是在此做了一些摘抄和整理的工作,来源均有注明. 0.虚拟 ...
- 对于Linux平台下C语言开发中__sync_函数的认识(转)
reference:http://gcc.gnu.org/onlinedocs/gcc-4.1.0/gcc/Atomic-Builtins.html#Atomic-Builtins A built-i ...
- aarch64_l1
L-function-1.23-18.fc26.aarch64.rpm 2017-02-14 08:01 139K fedora Mirroring Project L-function-devel- ...
- HDU 6196 happy happy happy 爆搜加剪枝
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6196 题意:给你长度为n的序列,爸爸和儿子玩一个游戏,儿子先手,儿子每次都选择最左边与最右边最大的那个 ...
- php rabbitmq的扩展
1.下载:https://github.com/alanxz/rabbitmq-c/archive/v0.9.0.tar.gz mkdir build && cd build # 这一 ...
- CSS3小黄人
CSS3实现小黄人 效果图: 代码如下,复制即可使用: <!DOCTYPE HTML> <HTML> <head> <title>CSS3实现小黄人&l ...
- 如何阻止点击scrollviewer里面的单位内容时,自动滚动
<Style TargetType="{x:Type ListBoxItem}"> <Setter Property="FocusVisualStyle ...