float 与 double 类型区别

🌸 float 与 double 类型区别 🌸

  • float 单精度浮点数 在机内占 4 个字节,用 32 位二进制描述。
  • double 双精度浮点数 在机内占 8 个字节,用 64 位二进制描述。
  • 浮点数在机内用指数型式表示,分解为: 数符,尾数,指数符,指数 四部分。
    • 数符占 1 位二进制,表示数的正负。
    • 指数符占 1 位二进制,表示指数的正负。
    • 尾数表示浮点数有效数字,0.xxxxxxx, 但不存开头的 0 和点。
    • 指数存指数的有效数字。指数占多少位,尾数占多少位,由计算机系统决定

保留小数(尽量使用double,使用float会有精度丢失问题,以下代码自行发现问题)

  • 简单高效String.format
String format = String.format("%.2f", 100.115);
String format2 = String.format("%.2f", 100.115f);
  • Math.round
    • 存在缺点:若有效数字不满足要保留的位数,则为空
    • 如:1.12保留三位小数–> 1.12而非1.120
    • 注意Math.round()方法传float类型
float round = Math.round(1.12 * 1000000 )/1000000f;// == 1.12
float round = Math.round(1.121111 * 100 )/100f;// == 1.12
  • DecimalFormat
    • 存在缺点:
      • 开销大
      • 返回的是String类型
      • 有时候四舍五入会不准,需要自定义RoundingMode
        • HALF_UP 满5进1
        • UP 有数就进1
		// 保留两位小数,如果是零点几,则小数点前的0不显示,小数点后几个零就保留几位
        DecimalFormat df1 = new DecimalFormat("#.00");
        String format1 = df1.format(0.115);// .12

		// 保留两位小数,小数点后几个零就保留几位,小数点前至少保留一位数
        DecimalFormat df2 = new DecimalFormat("0.00");
        df2.setRoundingMode(RoundingMode.HALF_UP);
        String format2 = df2.format(10.115);// 10.12

		// 保留两位小数,小数点后几个零就保留几位,小数点前都保留,且如果是零点几,则小数点前的0也显示
        DecimalFormat df3 = new DecimalFormat("#0.00");
        String format3 = df3.format(100.115);// 100.11
        System.out.println();
  • 通过BigDecimal转换:
// 若使用double累类型的100.115再尝试
        BigDecimal b = new BigDecimal(100.115f);
        float m_price1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue(); // 
        float m_price2 = b.setScale(2, BigDecimal.ROUND_UP).floatValue();
  • 原因
    • 100.115会被自动转为100.1149999999999948840923025272786617279052734375
    • 所以建议使用
      • String format = String.format("%.2f", 100.115);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值