java 使用BigDecimal进行货币金额计算的操作
float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.bigdecimal。
而且使用bigdecimal类也可以进行大数的操作。
方法 | 类型 | 描述 |
---|---|---|
public bigdecimal(double val) | 构造 | 将double表示形式转换为bigdecimal |
public bigdecimal(int val) | 构造 | 将int表示形式转换为bigdecimal |
public bigdecimal(string val) | 构造 | 将字符串表示形式转换为bigdecimal |
public bigdecimal add(bigdecimal augend) | 普通 | 加法 |
public bigdecimal subtract(bigdecimal subtrahend) | 普通 | 减法 |
public bigdecimal multiply(bigdecimal multiplicand) | 普通 | 乘法 |
public bigdecimal divide(bigdecimal divisor) | 普通 | 除法 |
一、 bigdecimal的计算
金额的计算bigdecimal类
double d = 9.84; double d2 = 1.22; //注意需要使用bigdecimal(string val)构造方法 bigdecimal bigdecimal = new bigdecimal(double.tostring(d)); bigdecimal bigdecimal2 = new bigdecimal(double.tostring(d2)); //加法 bigdecimal bigdecimaladd = bigdecimal.add(bigdecimal2); double add = bigdecimaladd.doublevalue(); //减法 bigdecimal bigdecimalsubtract = bigdecimal.subtract(bigdecimal2); double subtract = bigdecimalsubtract.doublevalue(); //乘法 bigdecimal bigdecimalmultiply = bigdecimal.multiply(bigdecimal2); double multiply = bigdecimalmultiply.doublevalue(); //除法 int scale = 2;//保留2位小数 bigdecimal bigdecimaldivide = bigdecimal.divide(bigdecimal2, scale, bigdecimal.round_half_up); double divide = bigdecimaldivide.doublevalue(); //格式化 double format = 12343171.6; //获取常规数值格式 numberformat number = numberformat.getnumberinstance(); string str = number.format(format);//12,343,171.6 //获取整数数值格式 numberformat integer = numberformat.getintegerinstance(); str = integer.format(format);//如果带小数会四舍五入到整数12,343,172 //获取货币数值格式 numberformat currency = numberformat.getcurrencyinstance(); currency.setminimumfractiondigits(2);//设置数的小数部分所允许的最小位数(如果不足后面补0) currency.setmaximumfractiondigits(4);//设置数的小数部分所允许的最大位数(如果超过会四舍五入) str = currency.format(format);//¥12,343,171.60 //获取显示百分比的格式 numberformat percent = numberformat.getpercentinstance(); percent.setminimumfractiondigits(2);//设置数的小数部分所允许的最小位数(如果不足后面补0) percent.setmaximumfractiondigits(3);//设置数的小数部分所允许的最大位数(如果超过会四舍五入) str = percent.format(format);//1,234,317,160.00%
二、典型的double类型的数值运算
/** * double的计算不精确,会有类似0.0000000000000002的误差,正确的方法是使用bigdecimal或者用整型 * 整型地方法适合于货币精度已知的情况,比如12.11+1.10转成1211+110计算,最后再/100即可 * 以下是摘抄的bigdecimal方法: */ public class doubleutil implements serializable { private static final long serialversionuid = -3345205828566485102l; // 默认除法运算精度 private static final integer def_div_scale = 2; /** * 提供精确的加法运算。 * * @param value1 被加数 * @param value2 加数 * @return 两个参数的和 */ public static double add(double value1, double value2) { bigdecimal b1 = new bigdecimal(double.tostring(value1)); bigdecimal b2 = new bigdecimal(double.tostring(value2)); return b1.add(b2).doublevalue(); } /** * 提供精确的减法运算。 * * @param value1 被减数 * @param value2 减数 * @return 两个参数的差 */ public static double sub(double value1, double value2) { bigdecimal b1 = new bigdecimal(double.tostring(value1)); bigdecimal b2 = new bigdecimal(double.tostring(value2)); return b1.subtract(b2).doublevalue(); } /** * 提供精确的乘法运算。 * * @param value1 被乘数 * @param value2 乘数 * @return 两个参数的积 */ public static double mul(double value1, double value2) { bigdecimal b1 = new bigdecimal(double.tostring(value1)); bigdecimal b2 = new bigdecimal(double.tostring(value2)); return b1.multiply(b2).doublevalue(); } /** * 提供(相对)精确的除法运算,当发生除不尽的情况时, 精确到小数点以后10位,以后的数字四舍五入。 * * @param dividend 被除数 * @param divisor 除数 * @return 两个参数的商 */ public static double divide(double dividend, double divisor) { return divide(dividend, divisor, def_div_scale); } /** * 提供(相对)精确的除法运算。 当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入。 * * @param dividend 被除数 * @param divisor 除数 * @param scale 表示表示需要精确到小数点以后几位。 * @return 两个参数的商 */ public static double divide(double dividend, double divisor, integer scale) { if (scale < 0) { throw new illegalargumentexception("the scale must be a positive integer or zero"); } bigdecimal b1 = new bigdecimal(double.tostring(dividend)); bigdecimal b2 = new bigdecimal(double.tostring(divisor)); return b1.divide(b2, scale,roundingmode.half_up).doublevalue(); } /** * 提供指定数值的(精确)小数位四舍五入处理。 * * @param value 需要四舍五入的数字 * @param scale 小数点后保留几位 * @return 四舍五入后的结果 */ public static double round(double value,int scale){ if(scale<0){ throw new illegalargumentexception("the scale must be a positive integer or zero"); } bigdecimal b = new bigdecimal(double.tostring(value)); bigdecimal one = new bigdecimal("1"); return b.divide(one,scale, roundingmode.half_up).doublevalue(); } }
补充:java存储金额解决方案bigdecimal
使用bigdecimal来存储金额数据,数据库中使用decimal类型,长度18,小数点2。
在jpa中创建时如下:
@column(columndefinition="decimal(18,2)") private bigdecimal price; //商品价格
在数据库中创建时如下:
常用构造器:
bigdecimal(double) 创建一个具有参数所指定双精度值的对象
bigdecimal(long) 创建一个具有参数所指定长整数值的对象
bigdecimal(string) 创建一个具有参数所指定以字符串表示的数值的对象
常用方法:加减乘除
add(bigdecimal) bigdecimal对象中的值相加,返回bigdecimal对象
subtract(bigdecimal) bigdecimal对象中的值相减,返回bigdecimal对象
multiply(bigdecimal) bigdecimal对象中的值相乘,返回bigdecimal对象
divide(bigdecimal) bigdecimal对象中的值相除,返回bigdecimal对象
常用方法:数据转换
tostring() 将bigdecimal对象中的值转换成字符串
doublevalue() 将bigdecimal对象中的值转换成双精度数
floatvalue() 将bigdecimal对象中的值转换成单精度数
longvalue() 将bigdecimal对象中的值转换成长整数
intvalue() 将bigdecimal对象中的值转换成整数
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
下一篇: 基于opencv实现车道线检测
推荐阅读
-
Mac使用计算器快速进行两种货币之间的换算
-
java 使用BigDecimal进行货币金额计算的操作
-
荐 Java BigDecimalの食用方法,老大说我再用Double来进行数值的计算,造成的损失从我工资里扣!˚‧º·(˚ ˃̣̣̥⌓˂̣̣̥ )‧º·˚
-
RabbitMQ的5种模式,并使用java进行模拟操作
-
Java中使用Jedis连接Redis对List进行操作的常用命令
-
Java中使用Jedis连接Redis对Set进行操作的常用命令
-
Java中使用Jedis连接Redis对String进行操作的常用命令
-
Java中使用Jedis连接Redis对Key进行操作的常用命令
-
Mac使用计算器快速进行两种货币之间的换算
-
[Sqlite]--)Java使用jdbc连接Sqlite数据库进行各种数据操作的详