在java中,针对double、float类型的运算和比较都最好不要直接进行,可以依靠BigDecimal来进行
一、比较大小
- 转换成 long 再比较,(这是long是基本类型,而不是Long对象,对象比较不要用 ==)
Double.doubleToLongBits(0.042421d) == Double.doubleToLongBits(0.2342401d)
Double.doubleToLongBits(453.02d) > Double.doubleToLongBits(34.234501d)
Double.doubleToLongBits(765.07452d) < Double.doubleToLongBits(23432.3034d)
- 转换成字符串,然后用equals比较 (只能用于比较是不是相等)
Float.toString(453.2348f).equals(Float.toString(0.342f))
Double.toString(0.8456d).equals(Float.toString(0.242f))
二、运算
// 0.5382 * 0.78
new BigDecimal(Float.toString(0.5382f)).multiply(new BigDecimal(Float.toString(0.78f)))
// 错误的方式 new BigDecimal(0.5382f).multiply(new BigDecimal(0.78f))
注意:要使用new BigDecimal(Float.toString(0.5382f))
而不是new BigDecimal(0.5382f)
,里面先转成字符串,否则还是可能丢精度