钱的计算: 可能会损失精度;
BigDecimal 类进行计算;
https://blog.csdn.net/shadow_zed/article/details/73478298
BigDecimal比较大小问题
BigDecimal 的API使用:
public int compareTo(BigDecimal val)
将此 BigDecimal 与指定的 BigDecimal 比较。根据此方法,值相等但具有不同标度的两个 BigDecimal 对象(如,2.0 和 2.00)被认为是相等的。相对六个 boolean 比较运算符 (<, ==, >, >=, !=, <=) 中每一个运算符的各个方法,优先提供此方法。建议使用以下语句执行上述比较:(x.compareTo(y) <op> 0),其中 <op> 是六个比较运算符之一。
指定者: 接口 Comparable<BigDecimal>
中的 compareTo
参数: val
- 将此 BigDecimal 与之比较的 BigDecimal。
返回: 当此 BigDecimal 在数字上小于、等于或大于 val 时,返回 -1、0 或 1。
Double double = 1.0;
Boulean flag = double .compareTo(0.0) > 0 ;
/*其实俩个Double类似的数值可以按照比较 ;
*/
package utils;
import java.math.BigDecimal;
/**
* @Description: 金额精确运算处理类
* @date 2016年3月22日
*
*/
public class BigdecimalUtil {
private static final String BIGDECIMAL_ADD = "add"; // 加法运算
private static final String BIGDECIMAL_SUBTRACT = "subtract"; // 减法运算
private static final String BIGDECIMAL_MULTIPLY = "multiply"; // 乘法运算
private static final String BIGDECIMAL_DIVIDE = "divide"; // 除法运算
private static final int BIGDECIMAL_NEWINDEX = 2; // 精确运算,取*位小数
/**
* @Description: 对两个Double 数据进行精确运算
* @param d1 Double
* @param d2 Double
* @param str add、subtract、multiply、divide
* @return Double
* @throws
*/
public static Double bigdecimalAPI(Double d1, Double d2, String str){
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = new BigDecimal(d2);
BigDecimal bigDecimal = null;
if (BIGDECIMAL_ADD.equals(str)) {
bigDecimal = b1.add(b2);
}
if (BIGDECIMAL_SUBTRACT.equals(str)) {
bigDecimal = b1.subtract(b2);
}
if (BIGDECIMAL_MULTIPLY.equals(str)) {
bigDecimal = b1.multiply(b2);
}
if (BIGDECIMAL_DIVIDE.equals(str)) {
bigDecimal = b1.divide(b2, BIGDECIMAL_NEWINDEX, BigDecimal.ROUND_HALF_UP);
}
BigDecimal setScale = bigDecimal.setScale(BIGDECIMAL_NEWINDEX, BigDecimal.ROUND_HALF_UP);//取2位小数,四舍五入
BigDecimal.ROUND_HALF_DOWN);//取2位小数,四舍五入,但是5也是舍弃
return Double.parseDouble(setScale.toString());
}
总结:
1.BigDecimal 类使用户能完全控制舍入行为。如果未指定舍入模式,并且无法表示准确结果,则抛出一个异常;
2.当为任何输入参数传递 null 对象引用时,此类的所有方法和构造方法都将抛出 NullPointerException。提前进行空值判断;
3.工具类的健壮性很重要;