bigdecimal比较大小

Java 基础知识的一些易错点

泪湿孤枕 提交于 2020-03-14 15:25:06
1、正确使用 equals() Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。 String str = null; if (str.equals("abcd")) { ... } else { ... } 如果变量str为null,会抛出空指针异常,如果没有catch来捕获处理(我们一般不会在equals()上加try),程序直接就终止运行了。 abcd".equals(str) 把常量写在前面,“abcd”!=null,结果为false,不会抛出异常。 但2个都是变量呢? 最推荐下面的方式:使用工具类Objects(JDK7自带的) Objects.equals(str,"abcd") 就算2个都是变量,2个都是null,都不会抛出异常。如果2个都是null,null==null,返回true。 Objects的部分源码如下: public static boolean equals(Object a, Object b) { // 如果a==null的话此时a.equals(b)就不会得到执行,避免出现空指针异常。 return (a == b) || (a != null && a.equals(b)); } ||、&&都是断路的,如果||前面为true,就不会执行后面的判断;如果&&前面为false,就不会执行后面的判断。

BigDecimal浅析

大憨熊 提交于 2020-03-11 09:58:41
为什么使用BigDecimal 首先看一个例子: public class DoubleTest { public static void main(String[] args) { System.out.println(0.1 + 0.2); } } 输出的结果:0.30000000000000004(我们的预期是0.3) 其实float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。所有就出现了BigDecimal。 jdk文档BigDecimal的描述: 不可变的、任意精度的有符号十进制数。BigDecimal 由任意精度的整数非标度值和32位的整数标度(scale)组成。BigDecimal 表示的数值是 (unscaledValue × 10-scale)。 BigDecial构造方法 下面是常用的四种构造方法: BigDecimal(int) BigDecimal(double) BigDecimal(long) BigDecimal(String) public static void main(String[] args) { double a = 123.11; BigDecimal

java中new BigDecimal的坑

风流意气都作罢 提交于 2020-02-28 11:40:51
BigDecimal.valueOf(0.004) new BigDecimal(0.004) 前者:输出的结果是0.004 后者:输出的结果是0.00400000000000000008326672........................... 注意事项: 所以,在比较大小的时候,切记,要用BigDecimal.valueOf,否则临界值判断时逻辑就有误 原因:由于后者,对象没有指定精度,如果指定精度的话,也就正常了,如: new BigDecimal(0.004).setScale(3,RoundingMode.HALF_UP) 来源: oschina 链接: https://my.oschina.net/u/2350117/blog/784936

Java BigDecimal详解

我只是一个虾纸丫 提交于 2020-02-22 15:05:22
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

常用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

Java精确计算

浪子不回头ぞ 提交于 2020-01-25 16:14:57
简介 JAVA的double型数据以及float类型的数据均不能进行精确计算,许多编程语言也是一样,这与计算机的底层原理有关。 因此计算得出的结果往往超出预期。 尤其是在金融行业,计算价格或者银行业务的钱的计算。精确计算变得尤为重要。 虽然我们可以通过四舍五入的方式来处理结果,但是这样做就意味着存在着误差。 场景分析 比如说下面这些计算,我知道结果应该是精确的数字,计算机并没有计算出我们想要的结果。 /** * @author wzm * @version 1.0.0 * @date 2020/1/25 14:24 **/ public class MathTest { public static void main(String[] args) { System.out.println(0.05 + 0.01); System.out.println(1.0 - 0.43); System.out.println(2.03 * 10); System.out.println(3.3 / 10); } } 计算结果: 0.060000000000000005 0.5700000000000001 20.299999999999997 0.32999999999999996 BigDecimal Java中提供精确计算的类。 java.math.BigDecimal 四则运算

Java中BigDecimal的8种舍入模式

眉间皱痕 提交于 2019-12-17 01:24:51
Java中BigDecimal的8种舍入模式 java.math.BigDecimal 不可变的、任意精度的有符号十进制数。BigDecimal 由任意精度的整数非标度值和32位的整数标度(scale)组成。 如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以10的负scale次幂。 因此,BigDecimal表示的数值是(unscaledValue × 10-scale)。 与之相关的还有两个类: java.math.MathContext: 该对象是封装上下文设置的不可变对象,它描述数字运算符的某些规则,如数据的精度,舍入方式等。 java.math.RoundingMode: 这是一种枚举类型,定义了很多常用的数据舍入方式。 这个类用起来还是很比较复杂的,原因在于舍入模式,数据运算规则太多太多, 不是数学专业出身的人看着中文API都难以理解,这些规则在实际中使用的时候在翻阅都来得及。 在银行、帐户、计费等领域,BigDecimal提供了精确的数值计算。其中8种舍入方式值得掌握。 1、ROUND_UP 舍入远离零的舍入模式。 在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。 注意,此舍入模式始终不会减少计算值的大小。 2、ROUND_DOWN 接近零的舍入模式。 在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。

Java 金额计算不能用float、double!必须用BigDecimal

断了今生、忘了曾经 提交于 2019-12-16 01:56:32
转自: https://www.jianshu.com/p/c9437365702c 金额计算不能用double!!!! 金额计算不能用double!!!! 金额计算不能用double!!!! 重要的事情讲三遍。 先说一下产生丢失精度的原因:浮点数不精确的根本原因在于尾数部分的位数是固定的,一旦需要表示的数字的精度高于浮点数的精度,那么必然产生误差!这在处理金融数据的情况下是绝对不允许存在的。 金额计算必须用BigDecimal,下面对比一下用double 跟BigDecimal的区别,这里为了方便我直接调用工具类MoneyUtil,最后再来看工具类怎么实现 1.出现科学计数法: 1. double d1 = 0.00000000000000001; 2. Log.v("zyl", "d1:"+d1); Log.v("zyl", "d1:"+MoneyUtil.formatMoney(d1+"")); 控制台输出结果:d1:1.0E-17 d1:0.00000000000000001000 2.计算金额不准确,丢失精度: 1. double d1 = 11540; 2. double d2 = 0.35; 3. Log.v("zyl", "result:"+(d1*d2)); 4. Log.v("zyl", "result2:"+MoneyUtil.moneyMul(d1+"",

BigDecimal类型比较大小

烈酒焚心 提交于 2019-12-10 14:08:20
有两种方法: 1:转成int型: BigDecimal aa = new BigDecimal ( "1.234" ) ; if ( aa . intValue ( ) > 1 ) { aa = 1 ; System . out . println ( aa ) ; } 2:compareTo方法比较 -1:小于;0:等于;1:大于 BigDecimal aa = new BigDecimal ( "1.234" ) ; if ( aa . compareTo ( BigDecimal . valueOf ( 1 ) ) == 0 ) { aa = 1 ; System . out . println ( aa ) ; } 来源: CSDN 作者: java小童鞋 链接: https://blog.csdn.net/qq_37555514/article/details/103473669