JAVA中精确计算金额BigDecimal
package com.chauvet.utils; import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat; /***
*
* 金额
*
* 如果需要精确计算,必须用String来够造BigDecimal! !!
*
* Java里面的商业计算,不能用float和double,因为他们无法 进行精确计算。
* 但是Java的设计者给编程人员提供了一个很有用的类BigDecimal,
* 他可以完善float和double类无法进行精确计算的缺憾。
* BigDecimal类位于java.maths类包下。
* 它的构造函数很多,最常用的:
* BigDecimal(double val)
* BigDecimal(String str)
* BigDecimal(BigInteger val)
* BigDecimal(BigInteger unscaledVal, int scale) *
* @author wxw
*
*/
public class AmountUtil { /***
* 保留2位小数
* 四舍五入
* @param a
*
* @return
* 返回一个double类型的2位小数
*/
public static Double get2Double(Double doubleVal,int scale){
if(null == doubleVal){
doubleVal = new Double(0);
}
return new BigDecimal(doubleVal).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
} /***
* 格式化Double类型并保留scale位小数
* 四舍五入
* @param doubleVal
* @param scale
* scale必须为大于0的正整数,不能等于0
* @return
*/
public static String formatBy2Scale(Double doubleVal,int scale){
if(null == doubleVal){
doubleVal = new Double(0);
}
StringBuffer sbStr = new StringBuffer("0.");
for (int i = 0; i < scale; i++) {
sbStr.append("0");
}
DecimalFormat myformat = new DecimalFormat(sbStr.toString());
return myformat.format(doubleVal);
} /***
* Double类型相加 <font color="red">+</font><br/>
* ROUND_HALF_UP <font color="red">四舍五入</font><br/>
* @param val1
*
* @param val2
*
* @param scale
* <font color="red">保留scale位小数</font><br/>
* @return
*/
public static Double add(Double val1,Double val2,int scale){
if(null == val1){
val1 = new Double(0);
}
if(null == val2){
val2 = new Double(0);
}
return new BigDecimal(Double.toString(val1)).add(new BigDecimal(Double.toString(val2))).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
} /***
* Double类型相减 <font color="red">—</font><br/>
* ROUND_HALF_UP <font color="red">四舍五入</font><br/>
* @param val1
*
* @param val2
*
* @param scale
* <font color="red">保留scale位小数</font><br/>
* @return
*/
public static Double subtract(Double val1,Double val2,int scale){
if(null == val1){
val1 = new Double(0);
}
if(null == val2){
val2 = new Double(0);
}
return new BigDecimal(Double.toString(val1)).subtract(new BigDecimal(Double.toString(val2))).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
} /***
* Double类型相乘 <font color="red">*</font><br/>
* ROUND_HALF_UP <font color="red">四舍五入</font><br/>
* @param val1
*
* @param val2
*
* @param scale
* <font color="red">保留scale位小数</font><br/>
* @return
*/
public static Double multiply(Double val1,Double val2,int scale){
if(null == val1){
val1 = new Double(0);
}
if(null == val2){
val2 = new Double(0);
}
return new BigDecimal(Double.toString(val1)).multiply(new BigDecimal(Double.toString(val2))).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
} /***
* Double类型相除 <font color="red">/</font><br/>
* ROUND_HALF_UP <font color="red">四舍五入</font><br/>
* @param val1
*
* @param val2
*
* @param scale
* <font color="red">保留scale位小数</font><br/>
* @return
*/
public static Double divide(Double val1,Double val2,int scale){
if(null == val1){
val1 = new Double(0);
}
if(null == val2 || val2 == 0){
val2 = new Double(1);
}
return new BigDecimal(Double.toString(val1)).divide(new BigDecimal(Double.toString(val2))).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
} /***
* Double类型取余 <font color="red">%</font><br/>
* ROUND_HALF_UP <font color="red">四舍五入</font><br/>
* @param val1
*
* @param val2
*
* @param scale
* <font color="red">保留scale位小数</font><br/>
* @return
*/
public static int divideAndRemainder(Double val1,Double val2,int scale){
if(null == val1){
val1 = new Double(0);
}
if(null == val2 || val2 == 0){
val2 = new Double(1);
}
return new BigDecimal(Double.toString(val1)).divideAndRemainder(new BigDecimal(Double.toString(val2)))[1].setScale(scale, BigDecimal.ROUND_HALF_UP).intValue();
} /***
* 格式化Double类型数据
*
* @param val
* @param fmt
* NumberFormat currency = NumberFormat.getCurrencyInstance(); //建立货币格式化引用
* NumberFormat percent = NumberFormat.getPercentInstance(); //建立百分比格式化引用
* @param maximumFractionDigits
* 如果是百分比 设置小数位数(四舍五入)
* @return
*/
public static String formatByNumberFormat(Double val,NumberFormat fmt,int maximumFractionDigits){
if(fmt.equals(NumberFormat.getPercentInstance())){
fmt.setMaximumFractionDigits(maximumFractionDigits); //百分比小数点最多3位
}
return fmt.format(val); } /***
* 比较大小
* -1、0、1,即左边比右边数大,返回1,相等返回0,比右边小返回-1。
* @param doubleVal
* @return
*/
public static int compareTo(Double val1,Double val2){
if(null == val1){
val1 = new Double(0);
}
if(null == val2){
val2 = new Double(0);
}
return new BigDecimal(val1).compareTo(new BigDecimal(val2));
} public static void main(String[] args) { // System.out.println(AmountUtil.get2Double(null,3));
// System.out.println(AmountUtil.add(12.2155, null,4));
// System.out.println(AmountUtil.subtract(12.2155, 1D,2));
// System.out.println(AmountUtil.multiply(12.2155, 2D,2));
// System.out.println(AmountUtil.divide(44.13, 2D,2));
// System.out.println(AmountUtil.divideAndRemainder(43D, 8D,0));
// System.out.println(AmountUtil.formatByNumberFormat(0.123456, NumberFormat.getPercentInstance(),3));
// System.out.println(AmountUtil.formatBy2Scale(12.23457,3)); DecimalFormat df = new DecimalFormat("0.00\u2030"); //"\u2030"表示乘以1000并显示为千分数
System.out.println(df.format(12.1233)); //8-->1234567.89‰ df = new DecimalFormat("0,000.0#");//在数字中添加逗号
System.out.println(df.format(123456789.12345)); //5-->-1,234.57 df = new DecimalFormat("0");//不保留小数点 四舍五入
System.out.println(df.format(123456789.9876)); //5-->-1,234.57
}
}
JAVA中精确计算金额BigDecimal的更多相关文章
- 第二章 Java浮点数精确计算
1.实际意义 在实际开发中,如果需要进行float或double的精确计算(尤其是财务计算),直接使用float或double是不行的(具体的例子看下边的代码的main方法的测试结果),需要使用Big ...
- Java中的数学运算BigDecimal
Math类 package ch7; /** * Created by Jiqing on 2016/11/24. */ public class MathDemo { public static v ...
- Java中涉及到金额业务的处理
一.MySql数据库中如何定义关于金额字段: 建议定义成[DECIMAL]类型,而不是float或者是double,因为这个两者是以二进制储存的,存在一定的误差.具体事例可参考https://blog ...
- java 小数精确计算
小数精确计算 System.out.println(2.00 -1.10);//0.8999999999999999 上面的计算出的结果不是 0.9,而是一连串的小数.问题在于1.1这个数字不能被精确 ...
- Java中精确的数字计算类BigDecimal
在日常开放当中需要我们计算数字,利率.通常Java的做法是使用Math相关的API.但是,这样做是不够精确的,由于float和double不能进行计算,如果强行进行计算会使得计算不准确.造成难以挽回的 ...
- java的数字精确计算问题-BigDecimal
java的数字运算,偶尔会出现精度的问题,以下阐述的 java的BigDecimal类的使用. 例如: System.out.println(0.9+0.3); 结果1.2 System.out.pr ...
- java第二周的学习知识4(对原码,补码,反码和java中浮点数计算不准确的总结)
原码:一个正数,转换为二进制位就是这个正数的原码.负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码. 但是原码有几个缺点,零分两种 +0 和 -0 .很奇怪是吧!还有,在进行不同符号的加法运 ...
- java中double的四舍五入 BigDecimal
转载:https://blog.csdn.net/xiaobing_122613/article/details/71077225 1. 功能 将程序中的double值精确到小数点后两位.可以四舍五入 ...
- Java浮点数精确计算
BigDecimal是Java提供的一个不变的.任意精度的有符号十进制数对象.
随机推荐
- CentOS----使用yum命令出现“could not retrieve mirrorlist http://mirrorlist.centos.org ***” - ybq155”
无聊安装了个mini版的32位的CentOS 6.5,进来想安装个东西,yum install emacs 提示什么 Loaded plugins: fastestmirror, refresh-pa ...
- Linux 笔记总览
LInux 性能分析 Linux IO实时监控命令详解
- Python之路 day2 购物车小程序1
#Author:ersa ''' 程序:购物车程序 需求: 启动程序后,让用户输入工资,然后打印商品列表 允许用户根据商品编号购买商品 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 可随时 ...
- Android性能优化篇
很多App都会遇到以下几个常见的性能问题: 启动速度慢:界面跳转慢:事件响应慢:滑动和动画卡顿. 一.启动速度优化. 优化初始化任务: 1. 把一些初始化任务懒加载初始化 2. 把初始化任务并行化(异 ...
- CentOS7下ifconfig command not found
执行命令 yum install net-tools
- 使用 Hive 作为 ETL 或 ELT 工具
用来处理数据的 ETL 和 ELT 工具的概述 数据集成和数据管理技术已存在很长一段时间.提取.转换和加载(ETL)数据的工具已经改变了传统的数据库和数据仓库.现在,内存中转换 ETL 工具使得提取. ...
- win server2008R2安装framework1.1后,在应用池中不能编辑选择framework1.1的解决办法
C:\Users\Administrator>mklink /d "c:/Windows/Microsoft.NET/Framework64/v1.1.4322" " ...
- apache下自定义404错误页面
404页面的目的是:告诉浏览者其所请求的页面不存在或链接错误,同时引导用户使用网站其他页面而不是关闭窗口离开. 很多开源系统包括CMS系统.Blog系统等不提供404页面或提供的404页面并未达到SE ...
- QB资料学习.01
1.多数据集的读取 A.取数SQL的配置,借用TStringList进行存储多个不同的取数SQL B.DBA取数: DBA.ReadMultipleDataSet(TStringList) C.结果 ...
- codeforces 451E Devu and Flowers
题意:有n个瓶子每个瓶子有 f[i] 支相同的颜色的花(不同瓶子颜色不同,相同瓶子花视为相同) 问要取出s支花有多少种不同方案. 思路: 如果每个瓶子的花有无穷多.那么这个问题可以转化为 s支花分到 ...