方法 1: 使用字符串格式化函数
这是最简单的方式,直接利用 Kotlin 的字符串模板或 format 函数。语法为 "%.nf".format(value),其中 n 表示要保留的小数位数(例如,n=2 保留两位小数)。
代码示例:
kotlin
fun main() {
val number = 3.1415926535
// 保留两位小数
val formatted1 = "%.2f".format(number)
println(formatted1) // 输出: 3.14
// 保留三位小数
val formatted2 = "%.3f".format(number)
println(formatted2) // 输出: 3.142
}
- 优点:简洁高效,不需要额外导入。
- 注意 :这会自动进行四舍五入(例如,
3.14159保留两位小数后变为3.14)。
方法 2: 使用 DecimalFormat 类
如果需要更灵活的格式化(如指定千位分隔符或自定义模式),可以使用 Java 标准库中的 DecimalFormat 类(Kotlin 兼容 Java)。格式模式如 "#.##" 表示保留两位小数。
代码示例:
kotlin
import java.text.DecimalFormat
fun main() {
val number = 3.1415926535
// 创建 DecimalFormat 实例,指定格式
val df = DecimalFormat("#.##") // 保留两位小数
val formatted = df.format(number)
println(formatted) // 输出: 3.14
// 保留三位小数,使用 "#.###"
val df2 = DecimalFormat("#.###")
println(df2.format(number)) // 输出: 3.142
}
- 优点:支持复杂格式(如添加货币符号),可配置舍入模式。
- 注意 :默认使用
HALF_EVEN舍入规则(类似四舍五入),如果需要其他规则,可以设置RoundingMode。
方法 3:BigDecimal的核心特性
- 高精度计算 :专为需要精确小数运算的场景设计,避免浮点数精度丢失问题(如
0.1 + 0.2 ≠ 0.3)。 - 不可变性 :所有运算会返回新的
BigDecimal对象,原对象不变。 - 灵活的舍入控制 :提供多种舍入模式(如
ROUND_HALF_UP、ROUND_CEILING)。
创建BigDecimal对象
通过字符串构造可避免二进制浮点数误差:
java
BigDecimal num1 = new BigDecimal("0.1"); // 推荐
BigDecimal num2 = BigDecimal.valueOf(0.1); // 内部调用Double.toString
基本运算示例
java
BigDecimal a = new BigDecimal("10.5");
BigDecimal b = new BigDecimal("3.2");
// 加法
BigDecimal sum = a.add(b); // 13.7
// 减法
BigDecimal diff = a.subtract(b); // 7.3
// 乘法
BigDecimal product = a.multiply(b); // 33.60
// 除法(需指定舍入模式)
BigDecimal quotient = a.divide(b, 2, RoundingMode.HALF_UP); // 3.28
舍入模式常用选项
RoundingMode.HALF_UP:四舍五入(银行家舍入)RoundingMode.CEILING:向正无穷舍入RoundingMode.FLOOR:向负无穷舍入RoundingMode.DOWN:向零舍入
注意事项
-
比较数值时使用
compareTo()而非equals()(后者会同时比较精度)。 -
涉及货币等场景时,通常设置精度为2位小数:
javaBigDecimal price = new BigDecimal("19.456").setScale(2, RoundingMode.HALF_UP);//19.46
选择建议
- 对于简单场景(如日志输出或 UI 显示),方法 1 更快捷。
- 对于需要精确控制或国际化格式的场景(如财务应用),方法 2 更强大。
- 方法3
BigDecimal的运算开销高于基本类型,适合对精度要求严格的场景,如财务计算、科学计量等。