double浮点数计算的一些问题,以及bigDecimal的使用,和DecimalFormat的对比、Long

double浮点数计算的一些问题,以及bigDecimal的使用,和DecimalFormat的对比、Long

文章目录

    • 考考你
      • System.out.println(1/5); 输出结果是多少?
      • System.out.println(null-0.0); 输出结果是多少?
    • double部分
      • double 计算如果一个空null,会报错吗?
      • double类型将分母置1
    • BigDecimal部分
      • 为什么要用BigDecimal
      • 格式化小数位数
      • BigDecimal的非空非0判断
      • 字符串转换为BigDecimal
    • DecimalFormat的例子
    • bigdecimal工具类
        • bigdecimal工具类-判断是否为空或0
      • DecimalFormat为什么不能格式化字符串
    • 答案部分
    • 其他
      • new BigDecimal(null)报空指针异常
      • 入参中如何判断BigDecimal是否为空
      • BeanUtils属性复制不能将Double复制到BigDecimal
      • BigDecimal add之后值不变
      • 小数点后保留位数
        • RoundingMode选哪个
      • 双精度和单精度的对比
        • 单精度最高可以表示几位有效小数
    • 容易出错的地方
    • Long
        • Long值比较时用什么呢?

考考你

先来几道简单的题目。

System.out.println(1/5); 输出结果是多少?

题目1答案

System.out.println(null-0.0); 输出结果是多少?

题目2答案

double部分

double 计算如果一个空null,会报错吗?

Doubled1=0.0;Doubled2=1.0;Doubleresult=d1-d2;

实测报错。 所以double类型计算之前,要进行非空校验。
这里要注意的是, 如果不set null,初始化的值是0.0,是不报错的。

double类型将分母置1

因为如果是分母是0.0,那么结果会为Infinity。
所以最好置为其他值。

Doubled1=0.0;Doubled2=1.0;Doubleresult=d1/(d2!=0?d2:1.0);

BigDecimal部分

为什么要用BigDecimal

java中浮点数计算不是很精准,BigDecimal可以很好的解决这个题目。

格式化小数位数

BigDecimal对这个的支持还是很好的。 例如,设置为6位小数。

privateBigDecimalamount;this.amount=newBigDecimal(0.0).setScale(6,BigDecimal.ROUND_HALF_UP);

BigDecimal的非空非0判断

实际当中,有很多需要判断BidDecimal不为空且不为0。
那么怎么写呢?

错误代码:

if(null!=amount&&!amount.equals(newBigDecimal(0))){}

这段代码乍看没问题,甚至测试的时候也没问题,但是实际是有问题的。
为什么呢,因为equals比的时候会考虑到scale。 如果传入的参数设置了scale,结果可能会不一致。

举例如下:

System.out.println(newBigDecimal(0).equals(newBigDecimal(0.0).setScale(2,BigDecimal.ROUND_HALF_UP)));// 返回 false

所以,应该用compareTo来比较。正确代码:

// bigDecimal不为空且不为0publicstaticbooleanisNotNullAndNotZero(BigDecimalbigDecimal){booleanflag=false;if(null!=bigDecimal&&0!=newBigDecimal<