将百分比值四舍五入到最接近的数字

时间:2020-08-25 22:20:35

标签: java

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

预期结果:

“ 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%)

1 个答案:

答案 0 :(得分:6)

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

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

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