计算BigDecimal的百分比

34

我没有找到任何本地方法来完成这个任务,所以我在一个帮助类中创建了自己的方法:

public static BigDecimal percentage(BigDecimal base, BigDecimal pct){
    return base.multiply(pct).divide(new BigDecimal(100));
}

但是我不太喜欢它,我想知道API是否有类似的功能。Number类(BigDecimal的祖先)可能是一个不错的选择。


5
为什么你不喜欢它?有什么问题吗? - S.Lott
3
我在想还有多少其他程序员会创造相同的方法,这只是符合DRY原则。即使是最简单的计算器也有一个百分比按钮,我不明白为什么这个类中没有。 - Lluis Martinez
2
@LluisMartinez:这里的问题在于精度。当你除以两个“BigDecimal”(计算百分比时),你必须提供适当的舍入模式。我想这就是为什么该类没有提供“percentage()”方法的原因。只需查看“BigDecimal”,已经有六种不同签名的“divide()”方法。如果提供一个百分比方法,你将不得不添加另外6+个方法,最终会使整个实现膨胀。 - user1438038
4个回答

34

我认为没有相关的 API(我从未需要过)。
你的解决方案很好,或许你可以添加常量 ONE_HUNDRED

public static final BigDecimal ONE_HUNDRED = new BigDecimal(100);

public static BigDecimal percentage(BigDecimal base, BigDecimal pct){
    return base.multiply(pct).divide(ONE_HUNDRED);
}

可能没有太多收益,只有在非常频繁地调用时才会有一些收益。

最终将其放入某个Util类中...


2
BigDecimal有ZERO、ONE和TEN,但没有HUNDRED或THOUSAND。很奇怪! - Lluis Martinez
@Lluis:ZEROONE相当古老(Java 1.2);TEN也已经有些过时了,自从Java 5以来;也许我们会在Java 7中得到HUNDERT :-) 但是无论如何创建它都不是什么大问题...问候! - user85421

14

您可能希望使用BigDecimal.scaleByPowerOfTen(-2)来实现除以100。

如果您执行了一百万次,它会叠加。根据我的经验,这种方法要快得多。

还有一个类似的方法BigDecimal.movePointLeft(2) - 请查看其他线程获取详细信息,并决定哪个方法更适合您。


7

可以自由地继承BigDecimal并添加该方法。除此之外,你还期望什么呢?你知道在哪里找到API并确认你想要的类没有该方法。个人而言,我认为这个功能如此微不足道,以至于将其放入标准API中没有太大意义。


8
是的,这很琐碎,但在某些类型的应用程序中经常使用。 - Lluis Martinez
2
我同意。虽然很简单,但是经常被使用。 - vsingh

5

在你所链接的问题中,只是将十进制数打印为百分比(例如将.25显示为“25%”):你确定你可以使用DecimalFormat计算百分比吗?你能否加入一个使用该技术计算12523的37%的示例? - Ilario
这是一个合理的担忧:我建议使用最大精度进行计算,例如在Java中使用double,并让格式实例执行规定的舍入;类似的问题在这里有所探讨。 - trashgod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接