打印数字,2位数字,但圆形,精度为6位数

时间:2017-02-09 17:05:24

标签: java double rounding bigdecimal decimalformat

获取“。”之后正好有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

2 个答案:

答案 0 :(得分:2)

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

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

在这种情况下,我建议您先使用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。我仍然不确定这是正确的回合方式,但你比我更了解你的要求:)

答案 1 :(得分:0)

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

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

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