Java与JS金额计算去掉小数部分的方法

由于除法、编程语言等特性,小数计算总是可能无法获取到精确的结果。但是金额计算又要求有精确的结果,这样的矛盾可以通过整数计算加去除小数部分来获取想要的结果。

  1. 乘法: 单价为9.99元的某物品购买9个,总价为89.91元。
  2. 除法: 总价 89.90,数量为9,通过舍去小数部分的单价为 9.98。

解决办法: 将元为单位的金额乘以100换算为分进行计算,对结果取整,除以100获得真实金额。

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是偶数)

var price = 10.99;
var quantity = 7;
var needPay = parseFloat(price * quantity);
// needPay的正确结果应该是76.93元  但是运行后发现needPay为76.93000000000001 
  • 通过 Number.toFixed(2) 方法修正。
  • 将元为单位的金额乘以100换算为分进行计算。s
var price = 10.99
var quantity = 7
var needPay = Math.floor(parseFloat(price*100 * quantity))/100;
// parseFloat(price*100 * quantity)的计算结果是7693.000000000001   使用Math.floor()方法向下取整,再除100  即为正确的结果

JavaScript 保留小数两位的方法

通过 Number.toFixed(2) 方法实现任意小数的保留

// 通过 Number.toFixed(2) 方法
var price = 10.9
var quantity = 7
var needPay = Math.floor(parseFloat(price*100 * quantity))/100;
var needPay2 = needPay.toFixed(2)
// parseFloat(price*100 * quantity)的计算结果是7693.000000000001   使用Math.floor()方法向下取整,再除100  即为正确的结果

Java 处理方法

Java 去掉小数部分的方法

  • Math.round(0.6) //向上取整,向上舍入到一个整数
  • Math.floor(0.6) //向下取整,向下舍入到一个整数
  • Math.round(0.6) //四舍五入,舍入到最近整数
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
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);
    }
    /**
     * DecimalFormat 转换最简便
     */
    public void m2() {
        DecimalFormat df = new DecimalFormat("#.00");
        System.out.println(df.format(f));
    }
    /**
     * String.format打印最简便
     */
    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();
    }
}

参考

posted @ 2022-03-02 11:53  落叶微风  阅读(14)  评论(0编辑  收藏  举报  来源