电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

java 使用BigDecimal進(jìn)行貨幣金額計算的操作

瀏覽:46日期:2022-08-16 15:33:56

float和double只能用來做科學(xué)計算或者是工程計算,在商業(yè)計算中我們要用 java.math.BigDecimal。

而且使用BigDecimal類也可以進(jìn)行大數(shù)的操作。

方法 類型 描述 public BigDecimal(double val) 構(gòu)造 將double表示形式轉(zhuǎn)換為BigDecimal public BigDecimal(int val) 構(gòu)造 將int表示形式轉(zhuǎn)換為BigDecimal public BigDecimal(String val) 構(gòu)造 將字符串表示形式轉(zhuǎn)換為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)構(gòu)造方法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位小數(shù)BigDecimal bigDecimalDivide = bigDecimal.divide(bigDecimal2, scale, BigDecimal.ROUND_HALF_UP);double divide = bigDecimalDivide.doubleValue();//格式化double format = 12343171.6;//獲取常規(guī)數(shù)值格式NumberFormat number = NumberFormat.getNumberInstance();String str = number.format(format);//12,343,171.6//獲取整數(shù)數(shù)值格式NumberFormat integer = NumberFormat.getIntegerInstance();str = integer.format(format);//如果帶小數(shù)會四舍五入到整數(shù)12,343,172//獲取貨幣數(shù)值格式NumberFormat currency = NumberFormat.getCurrencyInstance();currency.setMinimumFractionDigits(2);//設(shè)置數(shù)的小數(shù)部分所允許的最小位數(shù)(如果不足后面補(bǔ)0)currency.setMaximumFractionDigits(4);//設(shè)置數(shù)的小數(shù)部分所允許的最大位數(shù)(如果超過會四舍五入)str = currency.format(format);//¥12,343,171.60//獲取顯示百分比的格式NumberFormat percent = NumberFormat.getPercentInstance();percent.setMinimumFractionDigits(2);//設(shè)置數(shù)的小數(shù)部分所允許的最小位數(shù)(如果不足后面補(bǔ)0)percent.setMaximumFractionDigits(3);//設(shè)置數(shù)的小數(shù)部分所允許的最大位數(shù)(如果超過會四舍五入)str = percent.format(format);//1,234,317,160.00%二、典型的Double類型的數(shù)值運(yùn)算

/** * double的計算不精確,會有類似0.0000000000000002的誤差,正確的方法是使用BigDecimal或者用整型 * 整型地方法適合于貨幣精度已知的情況,比如12.11+1.10轉(zhuǎn)成1211+110計算,最后再/100即可 * 以下是摘抄的BigDecimal方法: */public class DoubleUtil implements Serializable { private static final long serialVersionUID = -3345205828566485102L; // 默認(rèn)除法運(yùn)算精度 private static final Integer DEF_DIV_SCALE = 2; /** * 提供精確的加法運(yùn)算。 * * @param value1 被加數(shù) * @param value2 加數(shù) * @return 兩個參數(shù)的和 */ 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(); } /** * 提供精確的減法運(yùn)算。 * * @param value1 被減數(shù) * @param value2 減數(shù) * @return 兩個參數(shù)的差 */ 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(); } /** * 提供精確的乘法運(yùn)算。 * * @param value1 被乘數(shù) * @param value2 乘數(shù) * @return 兩個參數(shù)的積 */ 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(); } /** * 提供(相對)精確的除法運(yùn)算,當(dāng)發(fā)生除不盡的情況時, 精確到小數(shù)點(diǎn)以后10位,以后的數(shù)字四舍五入。 * * @param dividend 被除數(shù) * @param divisor 除數(shù) * @return 兩個參數(shù)的商 */ public static Double divide(Double dividend, Double divisor) { return divide(dividend, divisor, DEF_DIV_SCALE); } /** * 提供(相對)精確的除法運(yùn)算。 當(dāng)發(fā)生除不盡的情況時,由scale參數(shù)指定精度,以后的數(shù)字四舍五入。 * * @param dividend 被除數(shù) * @param divisor 除數(shù) * @param scale 表示表示需要精確到小數(shù)點(diǎn)以后幾位。 * @return 兩個參數(shù)的商 */ 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(); } /** * 提供指定數(shù)值的(精確)小數(shù)位四舍五入處理。 * * @param value 需要四舍五入的數(shù)字 * @param scale 小數(shù)點(diǎn)后保留幾位 * @return 四舍五入后的結(jié)果 */ 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(); }}

補(bǔ)充:Java存儲金額解決方案BigDecimal

使用BigDecimal來存儲金額數(shù)據(jù),數(shù)據(jù)庫中使用decimal類型,長度18,小數(shù)點(diǎn)2。

在JPA中創(chuàng)建時如下:

@Column(columnDefinition='decimal(18,2)') private BigDecimal price; //商品價格

在數(shù)據(jù)庫中創(chuàng)建時如下:

java 使用BigDecimal進(jìn)行貨幣金額計算的操作

常用構(gòu)造器:

BigDecimal(double) 創(chuàng)建一個具有參數(shù)所指定雙精度值的對象

BigDecimal(long) 創(chuàng)建一個具有參數(shù)所指定長整數(shù)值的對象

BigDecimal(String) 創(chuàng)建一個具有參數(shù)所指定以字符串表示的數(shù)值的對象

常用方法:加減乘除

add(BigDecimal) BigDecimal對象中的值相加,返回BigDecimal對象

subtract(BigDecimal) BigDecimal對象中的值相減,返回BigDecimal對象

multiply(BigDecimal) BigDecimal對象中的值相乘,返回BigDecimal對象

divide(BigDecimal) BigDecimal對象中的值相除,返回BigDecimal對象

常用方法:數(shù)據(jù)轉(zhuǎn)換

toString() 將BigDecimal對象中的值轉(zhuǎn)換成字符串

doubleValue() 將BigDecimal對象中的值轉(zhuǎn)換成雙精度數(shù)

floatValue() 將BigDecimal對象中的值轉(zhuǎn)換成單精度數(shù)

longValue() 將BigDecimal對象中的值轉(zhuǎn)換成長整數(shù)

intValue() 將BigDecimal對象中的值轉(zhuǎn)換成整數(shù)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。如有錯誤或未考慮完全的地方,望不吝賜教。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 光栅尺_Magnescale探规_磁栅尺_笔式位移传感器_苏州德美达 | 知名电动蝶阀,电动球阀,气动蝶阀,气动球阀生产厂家|价格透明-【固菲阀门官网】 | 冷水机-冰水机-冷冻机-冷风机-本森智能装备(深圳)有限公司 | VI设计-LOGO设计公司-品牌设计公司-包装设计公司-导视设计-杭州易象设计 | 二氧化碳/活性炭投加系统,次氯酸钠发生器,紫外线消毒设备|广州新奥 | 滁州高低温冲击试验箱厂家_安徽高低温试验箱价格|安徽希尔伯特 | 刘秘书_你身边专业的工作范文写作小秘书 | 临沂招聘网_人才市场_招聘信息_求职招聘找工作请认准【马头商标】 | 工业用品一站式采购平台|南创工品汇-官网|广州南创 | 掺铥光纤放大器-C/L波段光纤放大器-小信号光纤放大器-合肥脉锐光电技术有限公司 | 巩义市科瑞仪器有限公司| 长沙中央空调维修,中央空调清洗维保,空气能热水工程,价格,公司就找维小保-湖南维小保环保科技有限公司 | 泥浆在线密度计厂家-防爆数字压力表-膜盒-远传压力表厂家-江苏大亚自控设备有限公司 | 乐考网-银行从业_基金从业资格考试_初级/中级会计报名时间_中级经济师 | 座椅式升降机_无障碍升降平台_残疾人升降平台-南京明顺机械设备有限公司 | 二手注塑机回收_旧注塑机回收_二手注塑机买卖 - 大鑫二手注塑机 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | 过滤器_自清洗过滤器_气体过滤器_苏州华凯过滤技术有限公司 | 云南成考网_云南成人高考报名网| 幂简集成 - 品种超全的API接口平台, 一站搜索、试用、集成国内外API接口 | 德州万泰装饰 - 万泰装饰装修设计软装家居馆 | 光谱仪_积分球_分布光度计_灯具检测生产厂家_杭州松朗光电【官网】 | 活性氧化铝球|氧化铝干燥剂|分子筛干燥剂|氢氧化铝粉-淄博同心材料有限公司 | YAGEO国巨电容|贴片电阻|电容价格|三星代理商-深圳市巨优电子有限公司 | 酸度计_PH计_特斯拉计-西安云仪 纯水电导率测定仪-万用气体检测仪-低钠测定仪-米沃奇科技(北京)有限公司www.milwaukeeinst.cn | 气动|电动调节阀|球阀|蝶阀-自力式调节阀-上海渠工阀门管道工程有限公司 | 济南电缆桥架|山东桥架-济南航丰实业有限公司 | 印刷人才网 印刷、包装、造纸,中国80%的印刷企业人才招聘选印刷人才网! | 原子吸收设备-国产分光光度计-光谱分光光度计-上海光谱仪器有限公司 | 细沙回收机-尾矿干排脱水筛设备-泥石分离机-建筑垃圾分拣机厂家-青州冠诚重工机械有限公司 | 专业生产动态配料系统_饲料配料系统_化肥配料系统等配料系统-郑州鑫晟重工机械有限公司 | 衬氟止回阀_衬氟闸阀_衬氟三通球阀_衬四氟阀门_衬氟阀门厂-浙江利尔多阀门有限公司 | 舞台木地板厂家_体育运动木地板_室内篮球馆木地板_实木运动地板厂家_欧氏篮球地板推荐 | 合金耐磨锤头_破碎机锤头_郑州市德勤建材有限公司 | 氨水-液氨-工业氨水-氨水生产厂家-辽宁顺程化工 | 护腰带生产厂家_磁石_医用_热压护腰_登山护膝_背姿矫正带_保健护具_医疗护具-衡水港盛 | 热熔胶网膜|pes热熔网膜价格|eva热熔胶膜|热熔胶膜|tpu热熔胶膜厂家-苏州惠洋胶粘制品有限公司 | 沙盘模型公司_沙盘模型制作公司_建筑模型公司_工业机械模型制作厂家 | 防勒索软件_数据防泄密_Trellix(原McAfee)核心代理商_Trellix(原Fireeye)售后-广州文智信息科技有限公司 | 【MBA备考网】-2024年工商管理硕士MBA院校/报考条件/培训/考试科目/提前面试/考试/学费-MBA备考网 | 恒温水槽与水浴锅-上海熙浩实业有限公司 | 深圳市八百通智能技术有限公司官方网站 |