我想将字符串格式的数字转换为带有一个小数点的百分比值。以下是我的示例输入和预期输出。
预期结果:
“ 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%)
答案 0 :(得分:6)
0.0195的问题在于,没有double
精度数在数学上完全等于它。当您在程序源代码中编写0.0195或将字符串“ 0.0195”解析为双精度时,实际上得到的数字会少一点。这就是格式化程序将其舍入到1.9%的原因。
您可以完全不使用double
数据类型来解决此问题:
formattedValue = numberFormat.format(new BigDecimal(number));