最小基金费率
题目
一个人想要投基金, 他希望投 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))
|