# 最小基金费率


# 最小基金费率

## 题目

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

## 输出示例

|  a   |   b    |   c    |
| :--: | :----: | :----: |
|  16  | 0.0015 | 16.69  |
|  43  | 0.0015 | 43.39  |
| 100  | 0.0015 | 103.48 |

## 我的解法

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

```kotlin
    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))
```


