java - 校验值为 'ceiling' 值并返回对应变量

标签 java if-statement implementation

我有一些常数,例如:

BigDecimal ceiling1 = new BigDecimal(5);
BigDecimal ceiling2 = new BigDecimal(10);
BigDecimal ceiling3 = new BigDecimal(20);

BigDecimal rate1 = new BigDecimal(0.01);
BigDecimal rate2 = new BigDecimal(0.02);
BigDecimal rate3 = new BigDecimal(0.04);
BigDecimal rate4 = new BigDecimal(0.09);

现在基于参数 f.e.:

BigDecimal arg = new BigDecimal(6);

我想检索基于此 if 结构(简化)的正确汇率:

if(arg <= ceiling1) {
   rate = rate1;
}else if(arg <= ceiling2) {
   rate = rate2;
} else if (arg <= ceiling3) {
   rate = rate3;
}else rate = rate4;

所以在我的示例中 rate 应该是 rate2

但我想知道是否有人知道一个更好的方法来实现这个,而不是一堆如果。

欢迎任何指点!

PS:我知道我的代码不是 100% 正确,只是想展示一下这个想法

最佳答案

您可以将上限存储为 TreeMap 中的键,将费率存储为值。然后使用 floorEntry 并参见 here .

final TreeMap<BigDecimal, BigDecimal> rates = new TreeMap<BigDecimal, BigDecimal>();
rates.put(new BigDecimal(0), new BigDecimal(0.01));
rates.put(new BigDecimal(5), new BigDecimal(0.02));
rates.put(new BigDecimal(10), new BigDecimal(0.04));
rates.put(new BigDecimal(20), new BigDecimal(0.09));

System.out.println(rates.floorEntry(new BigDecimal(0)).getValue());
System.out.println(rates.floorEntry(new BigDecimal(6)).getValue());
System.out.println(rates.floorEntry(new BigDecimal(10)).getValue());
System.out.println(rates.floorEntry(new BigDecimal(100)).getValue());

测试:http://ideone.com/VrucK .您可能想要使用不同的表示形式,正如您在测试中看到的那样,它看起来很丑陋(就像天花板上的整数)。顺便说一句,丑陋的输出来自 0.01 是双 which does funny things with decimal representations 的事实。 .

编辑:建议 cleanup .

关于java - 校验值为 'ceiling' 值并返回对应变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7997849/

相关文章:

java - 如何使用 Mockito 测试 DAO 方法?

java - 在简单的java程序中使用IF语句来应用折扣

shell - 使用 if-else 检查数字序列的连续性

Java文字游戏查询

c++ - JsonCpp 包装器

java - hibernate 恩弗斯 : Better way to add multiple Projections

java - Spring MVC @ModelAttribute 不包含提交的表单结果

java - 可以从 QuickBooks QBM 文件中获取 SQL 表。也许那里有一个 SQLite 数据库?

c++ - 为什么我在 for 循环中收到 'Else without previous if' 错误?

java - 球体上距离另一点最近的点