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对象中的值转换成整数

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

java计算人民币整数金额_java 使用BigDecimal进行货币金额计算的操作相关推荐

  1. java怎么操作货币,java 使用BigDecimal进行货币金额计算的操作

    float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal. 而且使用BigDecimal类也可以进行大数的操作. 方法 类型 描述 pu ...

  2. java 中subtract的用法_java中BigDecimal加减乘除基本用法

    Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数. 在实际应用中,需要对更大或者更小的数进 ...

  3. java中Math.pow()实例_Java.math.BigDecimal.pow()方法实例

    全屏 Java.math.BigDecimal.pow()方法实例 java.math.BigDecimal.pow(int n)返回一个BigDecimal,其值是 (thisn), 被精确计算的幂 ...

  4. java 判断是否整数倍_java怎样实现判断一个最高达1000位数字的整数是不是3的倍数。...

    展开全部 能被62616964757a686964616fe58685e5aeb9313334313463643整除的数的特征:各个数位上的数相加之和必定为3的倍数.import java.util. ...

  5. java中取整数绝对值_Java之——位运算求整数绝对值

    通过下面的位运算可以得到一个整数的绝对值 public int abs( int a ) { return (a + (a >> 31)) ^ (a >> 31) ;//前半部 ...

  6. java人民币换欧元_java – PdfBox编码符号货币欧元

    不幸的是,PDFBox的字符串编码远非完美(版本1.8.x).不幸的是,它在编码通用PDF对象中的字符串时使用相同的例程,就像在内容流中编码字符串时一样,这是根本错误的.因此,您必须自己转换为正确的编 ...

  7. java队列怎么实现线程_Java中利用线程和队列实现入库操作

    Java单线程中,如果需要大量的数据库操作,会在IO方面产生瓶颈,特别是数据库连接失败时,大量资源会消耗在数据库连接的检测上,从而使程序的实时响应速度变慢.解决的办法就是将数据库操作单独放置在一个线程 ...

  8. java注解中可使用对象_Java注解(二):实战 - 直接使用对象列表生成报表...

    通过对Java注解(一):介绍,思想及优点学习了解,相信大家对Java注解有一定程度的了解,本篇文章将实战项目中的应用来加深对Java注解的了解. 本实例实现根据指定字段的JavaBean,生成对应列 ...

  9. 计算n个整数中有多少个正整数、多少个负整数,并计算这些整数的总和和平均值

    描述 编写程序,输入若干个整数,如果输入0,输入即终止.判定读入的整数中有多少个正整数.多少个负整数,并计算这些整数的总和和平均值(0不计算在内).平均值结果保留2位小数. [输入] 一行中给出若干个 ...

最新文章

  1. Windows核心编程 第八章 用户方式中线程的同步(上)
  2. 我的360破解考题答案
  3. 微信接口调用 ---ACCESS_TOKEN
  4. android studio下NDK开发
  5. QT-qevent 事件的accept()和ignore()
  6. 前端学习(3172):react-hello-react之实现底部功能
  7. 浅析JavaScript和PHP中三个等号(===)和两个等号(==)的区别
  8. SpringCloud工作笔记040--- XMLHTTP中setRequestHeader()方法解析
  9. mongo源码学习(四)服务入口点ServiceEntryPoint
  10. SolidWorks 2010 SP0.0 最新下载+序列号 注册机及方法
  11. Synonyms——中文近义词工具【含源码解析与改进】
  12. matlab显示大图像
  13. 使用node加密excel文件
  14. 巴比特独家 | 区块链入选新基建,这几件事你不得不知
  15. Java后端程序员未来职业规划路线,超用心整理,建议收藏
  16. 前端开发打包工具——webpack(1)
  17. 中华英才网张建国:规划人生三级跳
  18. CSS------伪类(:first)和伪元素(::after)汇总以及区别分析
  19. 夜息seo培训内部教程
  20. 计算机专业学生新学期必读好书推荐

热门文章

  1. 修复液晶显示器屏幕上的划痕
  2. 论文中文翻译——Vulnerability Dataset Construction Methods Applied To Vulnerability Detection A Survey
  3. UE4VR学习笔记3
  4. Go语言中 Scan 与 Scanf 和 Scanln的区别
  5. 浪漫主义和革命英雄主义的回忆
  6. 【算法学习笔记六】递归之归纳法
  7. 参考文献格式自动生成器
  8. html字体字号颜色怎么设置,html字体样式大全 html怎么改变字体大小和颜色
  9. AI_综述----图像分割综述
  10. C/C++面试高频知识点八股文