一. 金额使用BigDecimal,具体使用方法
创建:new BigDecimal(stringorint), 创建时使用string或int, 不能用float,double否则会出现精度问题。
后台-前台:bigDecimal前端html显示类型bigDecimal,直接用String报错
`import java.math.BigDecimal
`args BigDecimal price1,BigDecimal price2 // 正确
`args String price1,String price2 //报错
- js中获取的bigDecimal为字符串,若需要计算,转换成数值类。
var price1 = Number($('.price1').text());
var price2 = Number($('.price2').text());
alert((price1 + price2).toFixed(2));
- 前台-后台: 前台字符串,后台接收参数可为BigDecimal
public static void test2(BigDecimal price1, BigDecimal price2, BigDecimal price3) {
}
二. BigDecimal运算
- 比较大小compareTo
BigDecimal price = new BigDecimal(Double.toString(1.0003));
BigDecimal price2 = new BigDecimal(Double.toString(1.0002));
System.out.println("比较大小:" + price.compareTo(price2));
- 加减乘除(直接用double计算会有精确问题,用BigDecimal的加减乘除方法)
double d1 = 200.94625d;
double d2 = 100d;
BigDecimal price = new BigDecimal(Double.toString(d1));
BigDecimal price2 = new BigDecimal(Double.toString(d2));
BigDecimal add = price.add(price2);
BigDecimal sub = price.subtract(price2);
BigDecimal mul = price.multiply(price2);
BigDecimal divide = price.divide(price2);
System.out.println(add + "," + (d1+d2));
System.out.println(sub + "," + (d1-d2));
System.out.println(mul + "," + d1*d2);
System.out.println(divide + "," + d1/d2);
结果:
300.94625,300.94624999999996
100.94625,100.94624999999999
20094.625000,20094.625
2.0094625,2.0094624999999997
三. 金额格式化
- 方法一:NumberFormat(有人民币符号,仅显示,不计算)
// 选择国家为中国
NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.CHINA);
BigDecimal price = new BigDecimal(Double.toString(123456789.456));
String yuan = nf.format(price);
System.out.println(yuan);
输出结果:
- 自带人民币符号
- 逗号分隔
- 四舍五入,保留两位小数
¥12,356,789.46
- 方法二:DecimalFormat(无人民币符号,无逗号分隔)
BigDecimal price = new BigDecimal(Double.toString(12356789.456));
//NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.CHINA);
DecimalFormat nf = new DecimalFormat("###,##0.00");
String yuan = nf.format(price);
System.out.println(yuan);
输出结果:
- 无人民币符号
- 可以控制显示位数,不足拿0补上(格式化时用#),或者不用拿0补上(格式化用0)
- 四舍五入
12,356,789.46
四. 百分号格式化
- 方法一:NumberFormat(有人民币符号,仅显示,不计算)
BigDecimal price = new BigDecimal(Double.toString(0.00796));
NumberFormat nf = NumberFormat.getPercentInstance();
nf.setMinimumFractionDigits(2); // 小数点后两位,没有补上0
//nf.setMaximumFractionDigits(2); // 小数点后两位,没有不补0
String yuan = nf.format(price);
System.out.println(yuan);
输出结果:
- 结果自动乘以100
- 四舍五入
- nf.setMinimumFractionDigits(2);或nf.setMaximumFractionDigits(2)控制保留位数,否则四舍五入到整数位,如本题为例结果:1%
0.80%
- 方法二:DecimalFormat
BigDecimal price = new BigDecimal(Double.toString(0.00796));
//NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.CHINA);
DecimalFormat nf = new DecimalFormat("0.##%");
String yuan = nf.format(price);
System.out.println(yuan);
输出结果:
- 结果自动乘以100
- 四舍五入
- 可以控制显示位数,不足拿0补上(格式化时用#),或者不用拿0补上(格式化用0)
0.8%
五. 补充
- 格式化还有一种方法,String.format(“%.2f”, price);也是四舍五入,保留两位小数。
- .bigDecimal的精度或 格式化的精确度,不管用的哪种方法,有限制。
price是float, 整数+小数位数只能保障到6位
price是double, 整数+小数位数只能保障到15位