🌸 float 与 double 类型区别 🌸
- float 单精度浮点数 在机内占 4 个字节,用 32 位二进制描述。
- double 双精度浮点数 在机内占 8 个字节,用 64 位二进制描述。
- 浮点数在机内用指数型式表示,分解为: 数符,尾数,指数符,指数 四部分。
- 数符占 1 位二进制,表示数的正负。
- 指数符占 1 位二进制,表示指数的正负。
- 尾数表示浮点数有效数字,0.xxxxxxx, 但不存开头的 0 和点。
- 指数存指数的有效数字。指数占多少位,尾数占多少位,由计算机系统决定
保留小数(尽量使用double,使用float会有精度丢失问题,以下代码自行发现问题)
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;
float round = Math.round(1.121111 * 100 )/100f;
- DecimalFormat
- 存在缺点:
- 开销大
- 返回的是String类型
- 有时候四舍五入会不准,需要自定义RoundingMode
DecimalFormat df1 = new DecimalFormat("#.00");
String format1 = df1.format(0.115);
DecimalFormat df2 = new DecimalFormat("0.00");
df2.setRoundingMode(RoundingMode.HALF_UP);
String format2 = df2.format(10.115);
DecimalFormat df3 = new DecimalFormat("#0.00");
String format3 = df3.format(100.115);
System.out.println();
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);