bigdecimal

Java - BigDecimal精确运算工具类

妖精的绣舞 提交于 2020-02-13 21:10:02
package com . boob . common . utils ; import java . math . BigDecimal ; /** * @description:精确运算工具类 * @author:boob * @since:2020/2/9 */ public class MathUtils { public MathUtils ( ) { } /** * 提供精确的加法运算。 * * @param v1 被加数 * @param v2 加数 * @return 两个参数的和 */ public static double add ( String v1 , String v2 , int precision ) { BigDecimal b1 = new BigDecimal ( v1 ) ; BigDecimal b2 = new BigDecimal ( v2 ) ; return b1 . add ( b2 ) . setScale ( precision , BigDecimal . ROUND_HALF_UP ) . doubleValue ( ) ; } /** * 提供精确的减法运算。 * * @param v1 被减数 * @param v2 减数 * @return 两个参数的差 */ public static double sub (

常用Java API:大数类

邮差的信 提交于 2020-02-13 12:38:41
摘要 java中的基础数据类型能存储的最大的二进制数是 2 ^ 63 - 1, 对应的十进制数是9223372036854775807,也就是说只要运算过程中会超过这个数,就会造成数据溢出,从而造成错误. 而java.math.*包中提供了大数类,其理论上可以存储无限位的大数,只要内存足够的话。 大数类又分为整数和浮点数.即BigInteger and BigDecimal 大数类的对象不能直接进行运算,需要调用类中相应的方法,并且方法的参数必须和调用的类相同,BigInteger不能调用BigDecimal, 不能作为其方法参数, 即整数和浮点数不能混合运算. BigInteger 和 BigDecimal 创建 1.直接声明 BigInteger a; BigDecimal b; 2.使用构造函数初始化 BigInteger a = new BigInteger("123456789101112131415"); BigDecimal b = new BigDecimal("123456.123456"); 赋值 BigInteger.valueOf(long val); BigDecimal.valueOf(double val); BigInteger a; BigDecimal b; 注意 val 不能超过 long 类型的最大取值9223372036854775807,

BigDecimal 基本使用 比较大小和加减乘除

本秂侑毒 提交于 2020-02-12 16:37:02
//比较大小: int a = bigdemical.compareTo(bigdemical2) //a = -1,表示bigdemical小于bigdemical2; //a = 0,表示bigdemical等于bigdemical2; //a = 1,表示bigdemical大于bigdemical2; Boolean flag = value1.compareTo(BigDecimal.ZERO) == 1 && value1.compareTo(BigDecimal.ONE) == -1; if (flag) { System.out.println("value1大于0小于1"); } //加减乘除: BigDecimal bignum1 = new BigDecimal("10"); BigDecimal bignum2 = new BigDecimal("5"); BigDecimal bignum3 = null; //加法 bignum3 = bignum1.add(bignum2); System.out.println("和 是:" + bignum3); //减法 bignum3 = bignum1.subtract(bignum2); System.out.println("差 是:" + bignum3); //乘法 bignum3 = bignum1

BigDecimal精确计算工具类

随声附和 提交于 2020-02-10 20:44:43
前言 在实际开发中,遇到例如货币,统计等商业计算的时候,一般需要采用java.math.BigDecimal类来进行精确计算。而这类操作通常都是可预知的,也就是通用的。所以,写了个工具类来方便以后的工作。 这是仓库地址: 仓库地址 BigDecimal的构建 一般而言,我们主要从int,long,double,float来进行计算,在构建的时候推荐使用 BigDecimal BigDecimal(String s); 因为通过double构造会损失精度,而String构造是固定的值。 创建以下方法作为通用BigDecimal转化器: /** * Number -> BigDecimal */ public static <T extends Number> BigDecimal transform(T v) { if (v instanceof Double) { return new BigDecimal(Double.toString((Double) v)); } else if (v instanceof Integer) { return new BigDecimal(Integer.toString((Integer) v)); } else if (v instanceof Long) { return new BigDecimal(Long.toString(

并发编程之原子类

半腔热情 提交于 2020-02-07 00:49:17
Java从JDK 1.5开始提供了java.util.concurrent.atomic包(以下简称Atomic包),这个包中 的原子操作类提供了一种用法简单、性能高效、线程安全地更新一个变量的方式。 🐤 内部都是采用CAS+volatile实现了无锁并发 这节不讲原理,只讲如何使用。 整体结构 从整体上可以分为5组,分别进行说明 ↘️ 基本类型 使用原子的方式更新基本类型 AtomicInteger:整形原子类 AtomicLong:长整型原子类 AtomicBoolean :布尔型原子类 数组类型 使用原子的方式更新数组里的某个元素 AtomicIntegerArray:整形数组原子类 AtomicLongArray:长整形数组原子类 AtomicReferenceArray :引用类型数组原子类 引用类型 AtomicReference:引用类型原子类 AtomicStampedRerence:原子更新引用类型里的字段原子类 AtomicMarkableReference :原子更新带有标记位的引用类型 对象的属性修改类型 AtomicIntegerFieldUpdater:原子更新整形字段的更新器 AtomicLongFieldUpdater:原子更新长整形字段的更新器 AtomicStampedReference :原子更新带有版本号的引用类型。该类将整数值与引用关联起来

Java第二次作业

让人想犯罪 __ 提交于 2020-02-06 05:31:36
person包代码: 1 package com.wsy.person; 2 3 public class Person { 4 private String name ; 5 private char sex; 6 private int age; 7 private String IDCardNumber; 8 9 public Person(String name, char sex, int age, String IDCardNumber) { 10 11 this.name = name; 12 this.sex = sex; 13 this.age = age; 14 this.IDCardNumber = IDCardNumber; 15 } 16 public void print() 17 { 18 System.out.println("姓名:"+name); 19 System.out.println("性别:"+sex); 20 System.out.println("年龄:"+age); 21 System.out.println("身份证号码:"+IDCardNumber); 22 } 23 public String getName() { 24 return name; 25 } 26 public void setName(String name

Forcing BigDecimals to use scientific notation

拜拜、爱过 提交于 2020-02-05 04:20:42
问题 I have this method: public void Example(BigDecimal value, int scale){ BigDecimal x = new BigDecimal("0.00001"); System.out.println("result: " + (value.multiply(x)).setScale(scale, RoudingMode.HALF_UP).toString()); If, per example, value = 1 and scale = 2, the output is "result: 0.00". I thought it would be 1.00E-5. So, my doubt is: How can I force a BigDecimal to be formated in scientific notation if its scale is bigger than a certain value (it was 2 in my example) ? 回答1: You can use a

Java BigDecimal详解

血红的双手。 提交于 2020-02-05 03:06:25
1.引言   float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,这时候BigDecimal就派上大用场啦。 先看下面代码 public static void main(String[] args) { System.out.println(0.2 + 0.1); System.out.println(0.3 - 0.1); System.out.println(0.2 * 0.1); System.out.println(0.3 / 0.1); } 运行结果如下 你认为你看错了,但结果却是是这样的。问题在哪里呢?原因在于我们的计算机是二进制的。浮点数没有办法是用二进制进行精确表示。我们的CPU表示浮点数由两个部分组成:指数和尾数,这样的表示方法一般都会失去一定的精确度,有些浮点数运算也会产生一定的误差。如:2.4的二进制表示并非就是精确的2.4。反而最为接近的二进制表示是 2.3999999999999999。浮点数的值实际上是由一个特定的数学公式计算得到的。 其实java的float只能用来进行科学计算或工程计算,在大多数的商业计算中,一般采用java.math

包装类

点点圈 提交于 2020-02-02 13:25:59
什么是包装类? Java中的数据类型分为基本数据类型和引用数据类型,其中基本数据类型是不具有对象特征的,也就是说它们不能像对象一样拥有属性和方法,以及对象化交互。 包装类的产生就是为了解决基本数据类型存在的这样一些问题,通过包装类可以让基本数据类型获取对象一样的特征,行使对象相关的权力。 包装类与基本数据类型 特点 所有包装类都是使用final修饰的,不能被继承,其中数值型对应的包装类都是继承自Number类 包装类是不可变类,包装类的对象被创建后,它所包含的基本类型数据就不能改变 作用 作为和基本数据类型对应的类类型存在,方便涉及到对象的操作 提供每种基本数据类型的相关属性如最大值、最小值等以及相关的操作方法 包装类的使用 1.与基本数据类型的转换 装箱:把基本数据类型转换成包装类,分为自动装箱和手动装箱 拆箱:把包装类转换成基本数据类型,分为自动拆箱和手动拆箱 装箱与拆箱示例: //装箱:把基本数据类型转换成包装类 //1、自动装箱 int t1=2; Integer t2=t1; //2、手动装箱:使用构造方法 Integer t3=new Integer(t1); //拆箱:把包装类转换成基本数据类型 //1、自动拆箱 int t4=t2; //2、手动拆箱:使用intValue方法 int t5=t2.intValue(); //拆箱为其他基本数据类型

Java大浮点数

泄露秘密 提交于 2020-01-31 03:27:06
BigDecimal 文章参考自 https://blog.csdn.net/GD_ONE/article/details/103951501 和百度百科 精度问题 BigDecimal舍入模式 ROUND_DOWN 向零舍入。 即1.55 变为 1.5 , -1.55 变为-1.5 ROUND_UP 向远离0的方向舍入 即 1.55 变为 1.6 , -1.55 变为-1.6 ROUND_CEILING 向正无穷舍入. 即 1.55 变为 1.6 , -1.55 变为 -1.5 ROUND_FLOOR 向负无穷舍入. 即 1.55 变为 1.5 , -1.55 变为 -1.6 ROUND_HALF_UP 四舍五入 即1.55 变为1.6, -1.55变为-1.6 ROUND_HALF_DOWN 五舍六入 即 1.55 变为 1.5, -1.5变为-1.5 ROUND_HALF_EVEN 如果舍入前一位的数字为偶数,则采用HALF_DOWN奇数则采用HALF_UP 如1.55 采用HALF_UP 1.45采用HALF_DOWN ROUND_UNNECESSARY 有精确的位数时,不需要舍入 BigDecimal在进行运算时也可以进行舍入 例如除法 divide(BigDecimal divisor, int scale, RoundingMode roundingMode)