用 2 位数字打印数字,但以 6 位精度四舍五入

print number with 2 digits but round with 6 digits of precision

用于获取“.”后恰好有 2 位数字的字符串。我可以做类似的事情:

        DecimalFormat df = (DecimalFormat)DecimalFormat.getInstance(Locale.US);
        df.applyPattern("0.00");
        df.setRoundingMode(RoundingMode.HALF_UP);
        String output = df.format(value);

当我有一个数字如 828.054999999702d 时,它会将它格式化为 828.05,这是目前为止正确的,因为下一个数字是“4”,它会将其四舍五入为零。

但是如果我需要保留更多的数字精度,只是不想显示它怎么办?

我快速创建的是这个工作代码:

        double prettyValue = value;
        prettyValue = Math.round(prettyValue * 1000000d) / 1000000d;
        prettyValue = Math.round(prettyValue * 100000d) / 100000d;
        prettyValue = Math.round(prettyValue * 10000d) / 10000d;
        prettyValue = Math.round(prettyValue * 1000d) / 1000d;
        prettyValue = Math.round(prettyValue * 100d) / 100d; 
        DecimalFormat df = (DecimalFormat)DecimalFormat.getInstance(Locale.US);
        df.applyPattern("0.00");
        df.setRoundingMode(RoundingMode.HALF_UP);
        String output = df.format(prettyValue);

这将对第 6、5、4、3 和第 2 位进行舍入,NumberFormat 不需要做任何事情,只需打印剩下的 2 个数字,之后就会有零。

但我认为应该已经有一个我只是看不到的开箱即用的舍入。尝试对 BigDecimals 做同样的事情对我来说会导致完全相同的问题。

我想要的结果是将 828.054999999702 四舍五入为 828.06

考虑到您要将其输出为字符串,为什么不使用

String output = String.format(java.util.Locale.US,"%.2f", doubleValue);

而不是所有的 DecimalFormat 东西?这会将 doubleValue 保留为原始值,并保持精度。

我不确定我是否完全理解你的问题所以让我回顾一下:

  • 您有一些 double 值的有效小数位数可能超过 6 个。
  • 您想将该值四舍五入为 6 位小数并使用 HALF_UP 模式。
  • 你只想显示前2位小数(我不明白为什么,但我不会质疑)。

在这种情况下,我建议您首先使用 BigDecimal 进行舍入,否则您可能会出现精度错误:

double value = 1.23456789;
BigDecimal rounded = BigDecimal.valueOf( value ).setScale(6, RoundingMode.HALF_UP);

这应该导致值 1.234568

然后像你一样使用 NumberFormat 但总是向下舍入:

DecimalFormat df = (DecimalFormat)DecimalFormat.getInstance(Locale.US);
df.applyPattern("#.##");
df.setRoundingMode(RoundingMode.DOWN);
String output = df.format( rounded );

这应该导致 1.23

使用 4.23499999999235 的输入值,您将得到 4.235000(四舍五入为 6 位数字)和 4.23.

编辑:我不知道有任何舍入模式可以将 4.23499999999235 舍入到 4.24 但您应该能够通过链接多个来实现它setScale() 调用:

BigDecimal rounded = BigDecimal.valueOf( value );
for( int digit = 6; digit >= 2; digit--) {
  rounded = rounded .setScale( digit, RoundingMode.HALF_UP );
}

应该四舍五入到小数位 6,然后是 5 等等,最后四舍五入到 4.24。我仍然不确定这是正确的舍入方式,但你比我更了解你的要求:)