目录

最小基金费率

最小基金费率

题目

一个人想要投基金, 他希望投 a 元, 但是他发现在同手续费的情况下他可以投的更多, 因为手续费的最小分度为0.01, 假设基金的费率为 b, 试求解同手续费下他可以投入最多的钱 c 是多少?

输出示例

a b c
16 0.0015 16.69
43 0.0015 43.39
100 0.0015 103.48

我的解法

语言: kotlin, 点击窗口可以全屏显示哦

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
    fun Int.round() = (this / 10.0).roundToInt() * 10
    fun Int.floor() = floor(this / 10.0).toInt() * 10

    /**
     * @param targetMoney Int 这里选择 int 的原因, 是因为担心 double 的数据精度.
     * @param feeRate Double 啊这... 这玩意它必须用 double 啊,绝了.
     */
    fun minHadleFee(targetMoney: Int, feeRate: Double): Double {
        val realMoney = (targetMoney * 1000 / (1 + feeRate)).toInt().round() // 扩大1000倍, 计算净值并四舍五入
        val maxFee = targetMoney * 1000 - realMoney + 5 // 尽可能让 fee 最大, 精确值
        var maxMoney = maxFee * (1 + feeRate) / feeRate // money / fee = (1 + rate) / rate, 精确度同 double, 近似认为精确
        if (maxMoney - maxMoney.toInt() == 0.0) maxMoney -= 10 // 如若刚好是 1.05 倍, 那么 - 10.
        return maxMoney.toInt().floor() / 1000.0 // 向下取整输出
    }
    println(minHadleFee(16, 0.0015))