此小工具类主要用于数值四舍五入、数值格式化输出,很简单,若想深入研究,敬请自行查阅 BigDecimal 或 DecimalFormat 的 API,BigDecimal.setScale(位数,四舍五入法)中四舍五入法有如下 7 种:

1、 ROUND_UP:远离零方向舍入。向绝对值最大的方向舍入,只要舍弃位非0即进位。

2、 ROUND_DOWN:趋向零方向舍入。向绝对值最小的方向输入,所有的位都要舍弃,不存在进位情况。

3、 ROUND_CEILING:向正无穷方向舍入。向正最大方向靠拢。若是正数,舍入行为类似于ROUND_UP,若为负数,舍入行为类似于ROUND_DOWN。Math.round()方法就是使用的此模式。

4、 ROUND_FLOOR:向负无穷方向舍入。向负无穷方向靠拢。若是正数,舍入行为类似于ROUND_DOWN;若为负数,舍入行为类似于ROUND_UP。

5、 HALF_UP:最近数字舍入(5进)。这是我们最经典的四舍五入。

6、 HALF_DOWN:最近数字舍入(5舍)。在这里5是要舍弃的。

7、 HAIL_EVEN:银行家舍入法。

不多说,直接上码,如下所示:

 /**
* Aaron.ffp Inc.
* Copyright (c) 2004-2016 All Rights Reserved.
*/
package cn.ffp.autotest.api.util; import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat; import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator; import cn.ffp.autotest.api.settings.CONSINFO; /**
* <strong>计算工具类</strong><br>
* <br>
* @author Aaron.ffp
* @version V1.0.0: autotest-api cn.ffp.autotest.api.util MathUtil.java, 2016-04-12 17:51:58.301 Exp $
*/
public class MathUtil {
private static Logger logger = Logger.getLogger(MathUtil.class.getName());
private static String msg = ""; public MathUtil() {
DOMConfigurator.configure(CONSINFO.CONF_LOG4J_XML);
} /**
* <strong>对数值进行格式化输出</strong><br>
* <ul>
* <li>例如:format("2.23956", 3)的结果为:2.240</li>
* </ul>
* <br>
* @author Aaron.ffp
* @version V1.0.0: autotest-api cn.ffp.autotest.api.util MathUtil.java format, 2016-04-12 20:13:43.664 Exp $
*
* @param digit 待格式化数值
* @param scale 保留位数(小于1时为整数)
* @return 格式化数字字符串
*/
public static String format(double digit, int scale) {
String format = "#."; if (scale < 1) {
format = "#";
} for (int i = 0; i < scale; i++) {
format += "0";
} return MathUtil.format(digit, format);
} /**
* <strong>对数值进行格式化输出</strong><br>
* <ul>
* <li>格式化样式示例(#.00,表示保留2位;#.0000,表示保留4位)</li>
* </ul>
* <br>
* @author Aaron.ffp
* @version V1.0.0: autotest-api cn.ffp.autotest.api.util MathUtil.java format, 2016-04-12 19:44:00.926 Exp $
*
* @param digit 待格式化数值
* @param format 格式化样式
* @return 格式化数值字符串
*/
private static String format(double digit, String format) {
try {
DecimalFormat decimalFormat = new DecimalFormat(format); return decimalFormat.format(digit);
} catch (NullPointerException npe) {
msg = "将数字【" + digit + "】依据样式【" + format + "】格式化失败,原因:";
logger.error(msg, npe); return null;
} catch (IllegalArgumentException iae) {
msg = "将数字【" + digit + "】依据样式【" + format + "】格式化失败,原因:";
logger.error(msg, iae); return null;
}
} /**
* <strong>对数值进行四舍五入</strong><br>
* <ul>
* <li>采用银行家舍入法</li>
* </ul>
* <br>
* @author Aaron.ffp
* @version V1.0.0: autotest-api cn.ffp.autotest.api.util MathUtil.java scale, 2016-04-12 19:42:52.068 Exp $
*
* @param digit 数值
* @param scale 保留位数
* @return 四舍五入后的数值
*/
public static String scale(String digit, int scale) {
try {
if (scale < 0) {
msg = "对【" + digit + "】进行四舍五入失败,原因:指定位数【" + scale + "】不可小于0!请检查!";
logger.warn(msg); return null;
} return new BigDecimal(digit).setScale(scale, RoundingMode.HALF_EVEN).toString();
} catch (NumberFormatException nfe) {
msg = "获取【" + digit + "】指定位数【" + scale + "】四舍五入失败,原因:";
logger.error(msg, nfe);
} catch (ArithmeticException ae) {
msg = "获取【" + digit + "】指定位数【" + scale + "】四舍五入失败,原因:";
logger.error(msg, ae);
} return null;
}
}

  

  对应测试源码:

 package cn.ffp.autotest.api.util;

 import org.testng.annotations.Test;

 public class MathUtilTest {
@Test(description = "public static String format(double digit, int scale) --- 测试")
public void test_format() {
System.out.println("MathUtil.format(\"2.23956\", 3) \t " + MathUtil.format(2.23956, 3));
System.out.println("MathUtil.format(\"2.23956\", 0) \t " + MathUtil.format(2.23956, 0));
System.out.println("MathUtil.format(\"2.23956\", -34) \t " + MathUtil.format(2.23956, -34));
} @Test(description = "public static String scale(String digit, int scale) --- 测试")
public void test_scale() {
System.out.println("MathUtil.scale(\"2.23956\", 3) \t " + MathUtil.scale("2.23956", 3));
System.out.println("MathUtil.scale(\"2.23956\", 0) \t " + MathUtil.scale("2.23956", 0));
System.out.println("MathUtil.scale(\"2.23956\", -3) \t " + MathUtil.scale("2.23956", -3));
}
}

至此, Java学习-047-数值格式化及小数位数四舍五入顺利完结,希望此文能够给初学 Java 的您一份参考。

最后,非常感谢亲的驻足,希望此文能对亲有所帮助。热烈欢迎亲一起探讨,共同进步。非常感谢! ^_^

Java学习-047-数值格式化及小数位数四舍五入的更多相关文章

  1. java如何获取一个double的小数位数

    前言 看标题是不是觉得这是一个很简单的问题,我一开始也是这么认为的,但是实际情况下,在各种情况下我们都进行了测试,发现很多实际情况是无法不尽如人意的. 方法分析 当前能想到的比较容易有下面几种 1.直 ...

  2. Matlab修改数值格式/精度/小数位数

    ————————————命令行方法————————————— 直接在命令行中输入以下命令,但该命令不影响数据的存储形式和计算精度,下次还需进行修改. format 默认格式  format short ...

  3. Matlab怎么修改显示数值格式/精度/小数位数

    参考:https://jingyan.baidu.com/article/7f41ecec1ad029593c095c70.html

  4. java.math.BigDecimal保留两位小数,保留小数,精确位数

    http://blog.csdn.net/yuhua3272004/article/details/3075436 使用java.math.BigDecimal工具类实现   java保留两位小数问题 ...

  5. java中int相除取小数点后两位或限定位数

    java 两个整数相除保留两位小数: http://blog.sina.com.cn/s/blog_624d755d0101cvuq.html java中,当两个整数相除时,由于小数点以后的数字会被截 ...

  6. Java指定保留小数位数的方法

    package com.qiyuan.util; import java.math.BigDecimal; import java.math.RoundingMode; import java.tex ...

  7. java实验三——求平均数,数组排序(有关java保留小数位数,由于编译器版本未到1.5导致的报错format函数第二个参数不对,要求是Object[])

    package hello; import java.util.Arrays; public class 实验三更正版 { public static void main(String[] args) ...

  8. 在JS中,将text框中数据格式化,根据不同的小数位数,格式化成对应的XXX,XXX,XXX.XX(2位小数) 或者XXX,XXX,XXX(0位小数)

    //在JS中,将text框中数据格式化,根据不同的小数位数,格式化成对应的XXX,XXX,XXX.XX(2位小数) 或者XXX,XXX,XXX(0位小数) function formatNum(num ...

  9. openerp学习笔记 自定义小数精度(小数位数)

    小数位数标识定义: lx_purchase/data/lx_purchase_data.xml <?xml version="1.0" encoding="utf- ...

随机推荐

  1. iOS学习06C语言结构体

    1.结构体的概述 在C语言中,结构体(struct)指的是一种数据结构,是C语言中构造类型的其中之一. 在实际应用中,我们通常需要由不同类型的数据来构成一个整体,比如学生这个整体可以由姓名.年龄.身高 ...

  2. BZOJ2158 : Crash 的旅行计划

    A类数据: $n,q\leq1000$ 修改:$O(1)$直接改 查询:$O(n)$BFS B类数据: $n,q\leq100000$,保证是一条链 用线段树维护区间最大前缀.后缀和 修改:$O(\l ...

  3. df卡住问题解决

    windows的share文件挂载到linux/mnt/share下,当windows重启,会导致df卡住. 运行           1 umount -l /mnt/share 2 killall ...

  4. Android的Proxy/Delegate Application框架 (主要介绍插件化开发)

    1. 插件化的原理 是 Java ClassLoader 的原理:Java ClassLoader基础 常用的其他解决方法还包括:Google Multidex,用 H5 代替部分逻辑,删无用代码,买 ...

  5. Coder-Strike 2014 - Round 1 C. Pattern

    题目的意思是给出n个长度相同的字符串然后找出与他们匹配的字符串 将字符串存入类似二维数组的里面,每一行代表一个字符串,遍历每列,判断每列是否有公共的匹配字符,如果有输出任意一个 如果没有输出'?' # ...

  6. BZOJ4491: 我也不知道题目名字是什么

    Description 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 Input 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一 ...

  7. java画图程序_图片用字母画出来_源码发布

    在之前写了一篇blog:java画图程序_图片用字母画出来 主要是把一些调试的截图发布出来,现在程序调试我认为可以了(当然,你如果还想调试的话,也可以下载源码自己调试). 就把源码发布出来. 项目结构 ...

  8. Pop3_解决PKIX:unable to find valid certification path to requested target 的问题

    最近有公司pop3协议接收pp邮箱出现异常,连不上服务器,错误内容: e: sun.security.validator.ValidatorException: PKIX path building ...

  9. Application Initialization Module for IIS 7.5

    http://www.iis.net/downloads/microsoft/application-initialization IIS7.5也有Warm Up功能 让ASP.NET第一次Reque ...

  10. CentOS VirtualBox启动虚拟及报错:VirtualBox error: Kernel driver not installed (rc=1908)

    VirtualBox error: Kernel driver not installed (rc=1908) Hi all, Let me first say that this is my fin ...