java BigDecimal实现精确加减乘除运算

摘要:
*@Paramv1 addend*@paramv2 addend*@return*/publicstaticdoubleadd{BigDecimalb1=newBigDecimal;BigDecimalb2=newBigDecimal;returnb1.add.doubleValue();}/***提供精确的减法*@Paramv1被除数*@paramv2除数*@返回两个参数的商*/publicstaticdoublediv{returndiv;}/***提供(相对)准确的划分。在取之不尽的除法的情况下,使用scale参数指定精度,随后的数字四舍五入*@paramv1*@paramv2除数*@paramscale的被除数表示需要精确到小数点后几位。
加法: b1.add(b2)    b2(加数) b1(被加数)
减法:
b1.subtract(b2) b2(减数) b1(被减数)
乘法: b1.multiply(b2) b2(乘数) b1(被乘数)
除法: b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP)   b2(除数) b1(被除数)
 


import
java.math.BigDecimal; /** * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精 * 确的浮点数运算,包括加减乘除和四舍五入。 */ public class Arith{ //默认除法运算精度 private static final int DEF_DIV_SCALE = 10; //这个类不能实例化 private Arith(){ } /** * 提供精确的加法运算。 * @param v1 被加数 * @param v2 加数 * @return 两个参数的和 */ public static double add(double v1,double v2){ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.add(b2).doubleValue(); } /** * 提供精确的减法运算。 * @param v1 被减数 * @param v2 减数 * @return 两个参数的差 */ public static double sub(double v1,double v2){ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.subtract(b2).doubleValue(); } /** * 提供精确的乘法运算。 * @param v1 被乘数 * @param v2 乘数 * @return 两个参数的积 */ public static double mul(double v1,double v2){ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.multiply(b2).doubleValue(); } /** * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 * 小数点以后10位,以后的数字四舍五入。 * @param v1 被除数 * @param v2 除数 * @return 两个参数的商 */ public static double div(double v1,double v2){ return div(v1,v2,DEF_DIV_SCALE); } /** * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 * 定精度,以后的数字四舍五入。 * @param v1 被除数 * @param v2 除数 * @param scale 表示表示需要精确到小数点以后几位。 * @return 两个参数的商 */ public static double div(double v1,double v2,int scale){ if(scale<0){ throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); } /** * 提供精确的小数位四舍五入处理。 * @param v 需要四舍五入的数字 * @param scale 小数点后保留几位 * @return 四舍五入后的结果 */ public static double round(double v,int scale){ if(scale<0){ throw new IllegalArgumentException("The scale must be a positive integer or zero"); } BigDecimal b = new BigDecimal(Double.toString(v)); BigDecimal one = new BigDecimal("1"); return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); } };

免责声明:文章转载自《java BigDecimal实现精确加减乘除运算》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇centos7快速搭建Minio个人文件服务器java转python代码下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Neo4j 第五篇:批量更新数据

相比图形数据的查询,Neo4j更新图形数据的速度较慢,通常情况下,Neo4j更新数据的工作流程是:每次数据更新都会执行一次数据库连接,打开一个事务,在事务中更新数据。当数据量非常大时,这种做法非常耗时,大多数时间耗费在连接数据库和打开事务上,高效的做法是利用Neo4j提供的参数(Parameter)机制和UNWIND子句:在一次数据更新中,进行一次连接,打...

Linux 下 FreeSWITCH 远程连接使用 MySQL 替代 SQLite

1. 安装unixODBC 和 MySQL ODBC Connector yum install unixODBC-devel mysql-connector-odbc 2. 创建软连接 ln -s libmyodbc5.so libmyodbc.so 3. 在远程MySQL服务器中创建数据库“freeswitch” ,创建有密码用户 4. 添加如下...

layui从子iframe打开父iframe的tab选项卡

数据表格字段: {field: 'novelId', title: '小说ID',100,templet: '<div><a href="javascript:;" _href="/contentManage/content-chapters.html" novelName="{{d.name}}" onclick="showChapte...

时钟代码

1> 电子时钟 1 <object id="honehoneclock"width="160"height="70"align="middle"codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0"clas...

Chrome(谷歌浏览器)和Firefox浏览器flash的swf文件发黑不透明问题解决方法

一直以来看到各大网站的FLASH都是黑框框的,很好奇,难道他们不知道flash是可以设成透明的?于是用IE Tab插件浏览了下,发现人家的网页又正常,这样一来我就开始怀疑是我的Chrome有问题,于是在换了多台电脑,多种操作系统之后找到了治标治本的方法:在遇到这里网站时,尽量用IE,如果你的网站也在这类网站之中,那么你可能需要修改自己的网站代码这是一则fl...

Nodejs 实现ESL内联FreeSWITCH设定说明

一、背景说明:   SIP Server IP (Centos):192.168.11.61  ,服务器IP(Windows):192.168.11.19 二、目的:   能够从192.168.11.19上通过Nodejs的modesl 内联访问到SIP Server(FreeSWITCH),从而实现对SIP Server状态信息的获取。之前有看过很多文档...