Kotlin保留小数位的三种方法

方法 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_UPROUND_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位小数:

    java 复制代码
    BigDecimal price = new BigDecimal("19.456").setScale(2, RoundingMode.HALF_UP);//19.46

选择建议

  • 对于简单场景(如日志输出或 UI 显示),方法 1 更快捷。
  • 对于需要精确控制或国际化格式的场景(如财务应用),方法 2 更强大。
  • 方法3 BigDecimal的运算开销高于基本类型,适合对精度要求严格的场景,如财务计算、科学计量等。
相关推荐
郝学胜-神的一滴8 小时前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
百锦再8 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
m0_7369191010 小时前
C++代码风格检查工具
开发语言·c++·算法
喵手10 小时前
Python爬虫实战:旅游数据采集实战 - 携程&去哪儿酒店机票价格监控完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集结果csv导出·旅游数据采集·携程/去哪儿酒店机票价格监控
2501_9449347310 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
helloworldandy10 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
黎雁·泠崖10 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
2301_7634724611 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
肖永威11 小时前
macOS环境安装/卸载python实践笔记
笔记·python·macos
TechWJ12 小时前
PyPTO编程范式深度解读:让NPU开发像写Python一样简单
开发语言·python·cann·pypto