获取“。”之后正好有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
。
答案 0 :(得分:2)
我不确定我是否完全理解你的问题,所以让我回顾一下:
double
值,可能超过6个重要的小数位数。在这种情况下,我建议您先使用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作为原始值,保持精度。