首页 > 解决方案 > 将百分比值四舍五入到最接近的数字

问题描述

我想将字符串格式的数字转换为带一位小数的百分比值。以下是我的示例输入和预期输出。

预期成绩:

"0.0195" => "2.0%"

"0.0401" => "4.0%"

我知道这可能是一个简单的问题,但我无法使用 java API 找到确切的解决方案,我尝试了 RoundingMode 枚举下存在的所有舍入模式,但没有舍入模式给出我预期的结果。你能帮忙吗,我可能遗漏了一些东西。


import java.math.RoundingMode;
import java.text.NumberFormat;

public class RoundingModeExample {
    public static void main(String[] args) {
        System.out.println(formatPercentage("0.0195") + "(expected 2.0%)");
        System.out.println(formatPercentage("0.0401") + "(expected 4.0%)");
    }

    private static String formatPercentage(String number) {
        String formattedValue = "";
        NumberFormat numberFormat = NumberFormat.getPercentInstance();
        numberFormat.setMinimumFractionDigits(1);
        numberFormat.setRoundingMode(RoundingMode.HALF_UP);
        try {
            formattedValue = numberFormat.format(Double.valueOf(number));
        } catch (NumberFormatException e) {
            formattedValue = number;
        }
        return formattedValue;
    }


}

上述程序的输出:

1.9%(预期2.0%)

4.0%(预期4.0%)

标签: java

解决方案


0.0195 的问题在于没有double精确的数字在数学上完全等于它。当你在程序源代码中写0.0195或者将字符串“0.0195”解析成double时,你得到的数字实际上是少了一点。这就是格式化程序将其四舍五入为 1.9% 的原因。

您可以通过完全不使用double数据类型来解决此问题:

formattedValue = numberFormat.format(new BigDecimal(number));

推荐阅读