杰瑞科技汇

Java中如何精确取double类型小数点后两位?

在 Java 中,要获取 double 类型数值的小数点后两位,有几种常见的方法,根据你的具体需求(是四舍五入后显示,还是直接截断),可以选择不同的方法。

Java中如何精确取double类型小数点后两位?-图1
(图片来源网络,侵删)

下面我将介绍几种最常用的方法,并附上代码示例和说明。


使用 String.format() (推荐,用于格式化输出)

这是最简单、最直接的方法,适用于将 double 格式化为一个保留两位小数的字符串,通常用于显示或打印。

特点:

  • 四舍五入:默认会进行四舍五入。
  • 返回字符串:结果是 String 类型,不能直接用于后续的数学计算。
  • 非常灵活:可以轻松修改格式,比如保留1位、3位小数,或者添加千位分隔符等。

代码示例:

Java中如何精确取double类型小数点后两位?-图2
(图片来源网络,侵删)
public class DoubleFormatting {
    public static void main(String[] args) {
        double number1 = 123.4567;
        double number2 = 10.1;
        double number3 = 99.994;
        // 使用 String.format() 格式化为两位小数的字符串
        String formatted1 = String.format("%.2f", number1);
        String formatted2 = String.format("%.2f", number2);
        String formatted3 = String.format("%.2f", number3);
        System.out.println("原始值: " + number1 + " -> 格式化后: " + formatted1); // 输出: 123.46
        System.out.println("原始值: " + number2 + " -> 格式化后: " + formatted2); // 输出: 10.10
        System.out.println("原始值: " + number3 + " -> 格式化后: " + formatted3); // 输出: 99.99 (注意,这里会四舍五入为99.99)
    }
}

解释:

  • "%.2f" 是格式化字符串。
    • 表示格式说明符的开始。
    • .2:表示保留两位小数。
    • f:表示这是一个浮点数(float 或 double)。

使用 DecimalFormat (推荐,用于格式化输出)

DecimalFormatjava.text 包中的一个类,专门用于格式化数字,它比 String.format() 更强大,提供了更多本地化的格式化选项。

特点:

  • 四舍五入:同样会进行四舍五入。
  • 返回字符串:结果是 String 类型。
  • 功能强大:可以设置分组大小(千位分隔符)、货币符号、舍入模式等。

代码示例:

Java中如何精确取double类型小数点后两位?-图3
(图片来源网络,侵删)
import java.text.DecimalFormat;
public class DecimalFormatExample {
    public static void main(String[] args) {
        double number = 1234567.8912;
        // 创建一个 DecimalFormat 对象,模式是保留两位小数
        DecimalFormat df = new DecimalFormat("#.##");
        // 格式化数字
        String formattedNumber = df.format(number);
        System.out.println("原始值: " + number + " -> 格式化后: " + formattedNumber); // 输出: 1234567.89
        // 另一个例子,添加千位分隔符
        DecimalFormat dfWithSeparator = new DecimalFormat("#,###.00");
        String formattedWithSeparator = dfWithSeparator.format(number);
        System.out.println("带千位分隔符: " + formattedWithSeparator); // 输出: 1,234,567.89
    }
}

解释:

  • 是模式字符串。
    • 代表一个数字,如果该位没有数字则不显示。
    • 小数点。
    • 0:代表一个数字,如果该位没有数字则显示 0"0.00" 会格式化 110

使用 BigDecimal (推荐,用于精确计算)

如果你需要保留两位小数并进行数学运算,或者需要精确控制舍入模式,BigDecimal 是最佳选择。doublefloat 在计算机中存储的是近似值,直接进行运算可能会导致精度丢失。

特点:

  • 精确计算:避免了 double 的精度问题。
  • 可控制舍入模式:可以明确指定是 ROUND_HALF_UP (四舍五入)、ROUND_DOWN (直接截断) 等。
  • 返回 BigDecimal 对象:需要再转换回 doubleString

代码示例:

import java.math.BigDecimal;
import java.math.RoundingMode;
public class BigDecimalExample {
    public static void main(String[] args) {
        double number = 123.456;
        // 1. 将 double 转换为 BigDecimal (推荐使用 String 构造函数以避免精度问题)
        BigDecimal bd = new BigDecimal(String.valueOf(number));
        // 2. 设置保留两位小数,并指定舍入模式为四舍五入
        BigDecimal rounded = bd.setScale(2, RoundingMode.HALF_UP);
        // 3. 将结果转换回 double
        double resultDouble = rounded.doubleValue();
        System.out.println("原始值: " + number + " -> 四舍五入后(double): " + resultDouble); // 输出: 123.46
        // 4. 转换为字符串
        String resultString = rounded.toString();
        System.out.println("原始值: " + number + " -> 四舍五入后(String): " + resultString); // 输出: 123.46
        // 示例:直接截断(不舍入)
        BigDecimal truncated = bd.setScale(2, RoundingMode.DOWN);
        System.out.println("原始值: " + number + " -> 直接截断后: " + truncated); // 输出: 123.45
    }
}

重要提示:

  • 避免使用 new BigDecimal(double):由于 double 本身就不精确,用 new BigDecimal(123.456) 可能会引入额外的误差,推荐使用 new BigDecimal("123.456"),通过 String 构造可以保证精度。

使用 Math.round() (不推荐,有精度陷阱)

这种方法通过将数字放大、取整、再缩小来模拟四舍五入,虽然可行,但存在 double 精度问题,不推荐在生产代码中使用。

特点:

  • 四舍五入
  • 返回 longint,需要再转换回 double
  • 有精度风险:对于某些数字,由于浮点数的表示方式,可能会得到不正确的结果。

代码示例:

public class MathRoundExample {
    public static void main(String[] args) {
        double number = 123.456;
        // 1. 乘以 100
        double temp = number * 100; // 12345.6
        // 2. 四舍五入取整
        long roundedLong = Math.round(temp); // 12346
        // 3. 除以 100.0 (注意用 100.0 保证结果是 double)
        double result = roundedLong / 100.0;
        System.out.println("原始值: " + number + " -> 四舍五入后: " + result); // 输出: 123.46
    }
}

总结与选择

方法 主要用途 是否四舍五入 返回类型 推荐度 备注
String.format() 格式化输出(打印、显示) String ⭐⭐⭐⭐⭐ 简单直接,最常用。
DecimalFormat 格式化输出(打印、显示) String ⭐⭐⭐⭐ 功能比 String.format 更丰富,适合复杂格式。
BigDecimal 精确计算和格式化 可配置 BigDecimal / double ⭐⭐⭐⭐⭐ 金融、货币计算的首选,能避免精度问题。
Math.round() 简单的数值运算 long / int 不推荐,存在潜在的精度陷阱。

如何选择?

  • 如果你只是想把数字显示给用户看:使用 String.format("%.2f", yourDouble)DecimalFormat
  • 如果你需要对数字进行精确的数学运算(比如计算价格):必须使用 BigDecimal
  • 尽量避免使用 Math.round() 来处理小数位的四舍五入
分享:
扫描分享到社交APP
上一篇
下一篇