[Android]浮点数舍入规则RoundingMode

RoundingMode

/*
RoundingMode 是一个枚举类,用于指定数值舍入时的策略。
RoundingMode {
    UP,          // 向远离零的方向舍入。例如,1.1 和 1.5 都舍入为 2,而 -1.1 和 -1.5 都舍入为 -2。
    DOWN,        // 向接近零的方向舍入。例如,1.1 和 1.5 都舍入为 1,而 -1.1 和 -1.5 都舍入为 -1。
    CEILING,     // 向正无穷方向舍入。例如,1.1 和 1.5 都舍入为 2,而 -1.1 和 -1.5 都舍入为 -1。
    FLOOR,       // 向负无穷方向舍入。例如,1.1 和 1.5 都舍入为 1,而 -1.1 和 -1.5 都舍入为 -2。
    HALF_UP,     // 四舍五入。例如,1.5 舍入为 2,1.4 舍入为 1,而 -1.5 舍入为 -2,-1.4 舍入为 -1。
    HALF_DOWN,   // 五舍六入。例如,1.5 舍入为 1,1.6 舍入为 2,而 -1.5 舍入为 -1,-1.6 舍入为 -2。
    HALF_EVEN,   // 银行家舍入法(最接近的偶数)。例如,1.5 舍入为 2,2.5 也舍入为 2,而 -1.5 舍入为 -2,-2.5 也舍入为 -2。
    UNNECESSARY; // 不需要舍入。如果结果无法精确表示,则抛出 ArithmeticException。例如,试图对 1.5 进行舍入时会抛出异常。
}
*/
public enum RoundingMode {
    UP,
    DOWN,
    CEILING,
    FLOOR,
    HALF_UP,
    HALF_DOWN,
    HALF_EVEN,
    UNNECESSARY;

    private RoundingMode() {
    }

    public static RoundingMode valueOf(int rm) {
        throw new RuntimeException("Stub!");
    }
}

格式化金额

/**
 * 向负无穷方向舍入
 * 
 * 扩展属性用于将 Double? 转换为保留两位小数的货币字符串表示。
 * 使用 DecimalFormat 格式化数字
 * 例如,1.1 和 1.5 都舍入为 1,而 -1.1 和 -1.5 都舍入为 -2。
 */
val Double?.money: String
    get() {
        // 创建一个 DecimalFormat 对象 df。DecimalFormat 是一个用于格式化数字的类。"#.##" 这个模式字符串表示格式化时保留最多两位小数。
        val df = DecimalFormat("#.##")
        // 设置格式化时允许的最大小数位数为 2。即使输入的 Double 有更多的小数位数,也只会显示两位小数。
        df.maximumFractionDigits = 2
        // 设置格式化时要求的最小小数位数为 2。如果输入的 Double 小数位数不足两位,会用零填充。
        df.minimumFractionDigits = 2
        // 设置舍入模式为 FLOOR,即向负无穷方向舍入。
        df.roundingMode = RoundingMode.FLOOR
        return df.format(this ?: 0.00)
    }