由于除法、编程语言等特性,小数计算总是可能无法获取到精确的结果。但是金额计算又要求有精确的结果,这样的矛盾可以通过整数计算加去除小数部分来获取想要的结果。
- 乘法: 单价为9.99元的某物品购买9个,总价为89.91元。
- 除法: 总价 89.90,数量为9,通过舍去小数部分的单价为 9.98。
解决办法: 将元为单位的金额乘以100换算为分进行计算,对结果取整,除以100获得真实金额。
| 1
 | let price =  Math.floor((89.90*100)/9)/100
 | 
JavaScript 处理方法
JavaScript 去掉小数部分的方法
常用的去掉小数部分的方法:
- Math.ceil(.6)  // 向上取整,向上舍入到一个整数
- Math.floor(.6) // 向下取整,向下舍入到一个整数
- Math.round(.6) // 四舍五入,舍入到最近整数
- Number.toFixed(n) 四舍六入五成双,保留小数
toFixed它是一个四舍六入五成双的方法(也叫银行家算法),”四舍六入五成双”含义:对于位数很多的近似数,当有效位数确定后,其后面多余的数字应该舍去,只保留有效数字最末一位,这种修约(舍入)规则是“四舍六入五成双”,也即“4舍6入5凑偶”这里“四”是指≤4 时舍去,”六”是指≥6时进上,”五”指的是根据5后面的数字来定,当5后有数时,舍5入1;当5后无有效数字时,需要分两种情况来讲:①5前为奇数,舍5入1;②5前为偶数,舍5不进。(0是偶数)
| 12
 3
 4
 
 | var price = 10.99;var quantity = 7;
 var needPay = parseFloat(price * quantity);
 
 
 | 
- 通过 Number.toFixed(2) 方法修正。
- 将元为单位的金额乘以100换算为分进行计算。s
| 12
 3
 4
 
 | var price = 10.99var quantity = 7
 var needPay = Math.floor(parseFloat(price*100 * quantity))/100;
 
 
 | 
JavaScript 保留小数两位的方法
通过 Number.toFixed(2) 方法实现任意小数的保留
| 12
 3
 4
 5
 6
 
 | var price = 10.9
 var quantity = 7
 var needPay = Math.floor(parseFloat(price*100 * quantity))/100;
 var needPay2 = needPay.toFixed(2)
 
 
 | 
Java 处理方法
Java 去掉小数部分的方法
- Math.ceil(0.6) //向上取整,向上舍入到一个整数
- Math.floor(0.6) //向下取整,向下舍入到一个整数
- Math.round(0.6) //四舍五入,舍入到最近整数
| 12
 3
 4
 
 | double price = 10.99;double quantity = 7;
 double needPay = Math.floor(Double.valueOf(price*100 * quantity))/100;
 System.out.println(needPay);
 
 | 
Java 保留小数两位的方法
- DecimalFormat
- String.format(“%.2f”, f)
- NumberFormat
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 
 | public class BigDecimalFormat {double f = 111231.5585;
 public void m1() {
 BigDecimal bg = new BigDecimal(f);
 double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
 System.out.println(f1);
 }
 
 
 
 public void m2() {
 DecimalFormat df = new DecimalFormat("#.00");
 System.out.println(df.format(f));
 }
 
 
 
 public void m3() {
 System.out.println(String.format("%.2f", f));
 }
 public void m4() {
 NumberFormat nf = NumberFormat.getNumberInstance();
 nf.setMaximumFractionDigits(2);
 System.out.println(nf.format(f));
 }
 public static void main(String[] args) {
 BigDecimalFormat f = new BigDecimalFormat();
 f.m1();
 f.m2();
 f.m3();
 f.m4();
 }
 }
 
 | 
参考