由于除法、编程语言等特性,小数计算总是可能无法获取到精确的结果。但是金额计算又要求有精确的结果,这样的矛盾可以通过整数计算加去除小数部分来获取想要的结果。
- 乘法: 单价为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是偶数)
1 2 3 4
| var price = 10.99; var quantity = 7; var needPay = parseFloat(price * quantity);
|
- 通过 Number.toFixed(2) 方法修正。
- 将元为单位的金额乘以100换算为分进行计算。s
1 2 3 4
| var price = 10.99 var quantity = 7 var needPay = Math.floor(parseFloat(price*100 * quantity))/100;
|
JavaScript 保留小数两位的方法
通过 Number.toFixed(2) 方法实现任意小数的保留
1 2 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) //四舍五入,舍入到最近整数
1 2 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
1 2 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(); } }
|
参考