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%)
解决方案
0.0195 的问题在于没有double
精确的数字在数学上完全等于它。当你在程序源代码中写0.0195或者将字符串“0.0195”解析成double时,你得到的数字实际上是少了一点。这就是格式化程序将其四舍五入为 1.9% 的原因。
您可以通过完全不使用double
数据类型来解决此问题:
formattedValue = numberFormat.format(new BigDecimal(number));
推荐阅读
- pdf - Itext HtmlConverter.convertToPdf 将html转换为pdf很慢
- sql - SQL 查询两个 PIVOT 列组合
- c# - 允许 FileSystemWatcher 和 WriteTime/CreationTime 查看子目录?
- python - 将 seq2seq 模型的 TF 1.0 sampled_softmax_loss 函数重新实现到 TF 2 Keras 模型
- sql - R 和 dplyr:如何使用 compute() 在与源模式不同的模式中从 SQL 查询创建持久表?
- python - 为什么xml数据解析为字符串而不是int
- dafny - Dafny 简单断言不成立
- node.js - 如何管理 NodeJs 应用程序代码以减少混乱
- c# - 在MVC5中从BLL层调用函数到控制器
- ios - 如何修复 iOS/Xcode 构建错误,未定义符号`__C.NSURLSession.DataTaskPublisher`?