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<