我想要的是一种将double转换为字符串的方法,该方法使用向上舍入法进行四舍五入-即,如果要舍入的小数点是5,它总是向上舍入到下一个数字.这是大多数人在大多数情况下期望的标准四舍五入方法.

我还希望只显示有效数字,即不应有任何尾随零.

我知道这样做的一种方法是使用String.format法:

String.format("%.5g%n", 0.912385);

退货:

0.91239

这很好,但是它总是显示小数点后5位的数字,即使它们不重要:

String.format("%.5g%n", 0.912300);

退货:

0.91230

另一种方法是使用DecimalFormatter:

DecimalFormat df = new DecimalFormat("#.#####");
df.format(0.912385);

退货:

0.91238

然而,正如你所看到的,这使用了半偶数舍入.也就是说,如果前一个数字是偶数,它将向下取整.我想要的是:

0.912385 -> 0.91239
0.912300 -> 0.9123

在Java中实现这一点的最佳方法是什么?

推荐答案

使用setRoundingMode,将RoundingMode显式设置为使用半偶圆处理问题,然后将格式模式用于所需的输出.

例子:

DecimalFormat df = new DecimalFormat("#.####");
df.setRoundingMode(RoundingMode.CEILING);
for (Number n : Arrays.asList(12, 123.12345, 0.23, 0.1, 2341234.212431324)) {
    Double d = n.doubleValue();
    System.out.println(df.format(d));
}

给出了输出:

12
123.1235
0.23
0.1
2341234.2125

EDIT:原始答案没有解决双精度值的准确性问题.如果您不太在意它是向上还是向下舍入,这是可以的.但是,如果您想要精确的舍入,那么您需要将值的预期精度考虑在内.浮点值在内部具有二进制表示形式.这意味着像2.7735这样的值实际上在内部并没有确切的值.它可以稍微大一点,也可以稍微小一点.如果内部值稍小,则不会四舍五入为2.7740.要纠正这种情况,您需要了解您正在使用的值的准确性,并在舍入之前添加或减go 该值.例如,当您知道值的精确度最高可达6位数时,若要向上舍入中值,请将该精确度添加到值中:

Double d = n.doubleValue() + 1e-6;

要进行四舍五入,请减go 精度.

Java相关问答推荐

Kotlin ReadWriteProperty:无法使用T作为具体化类型参数.改为使用类

如何使用Java API在Oracle ODI中运行模拟?

在模拟超类中设置非setter属性的值

如何确定springboot在将json字段转换为Dto时如何处理它?

Java编译器抛出可能未正确初始化的错误?

返回响应时,CamelCase命名约定不起作用

如何从Keyloak映射Hibernate实体中的用户

在Eclipse中调试未导出的JDK模块的Java包

无法播放音频:从资源加载库GStreamer-Lite失败

Spring Validator批注不起作用

使IntelliJ在导入时优先 Select 一个类或将另一个标记为错误

如何在右击时 Select 新行?

在具有Quarkus Panache的PostgreSQL中将JSON数据存储为JSONB时,会将其存储为转义字符串

基于距离的APACHE POI公式判断

spring 更新多项管理关系

由于版本不匹配,从Java 8迁移到Java 17和Spring 6 JUnit4失败

Java中计算大n和k值模10^9+7的二项式系数的乘法公式输出错误值

在输入端没有可行的替代方案'; Select *';

SonarQube在合并升级到java17后对旧代码提出错误

带有提取器的JavaFXObservableList会根据侦听器的存在而改变行为