后面有两个位数的字符串。我可以做这样的事情:
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,然后第二位,NumberFormat将不必做任何事,只需打印剩下的2个数字,然后将有零。
但我认为应该有一个我看不到的开箱即用的四舍五入。试图对BigDecimals做同样的事情对我来说也是同样的问题。
我想要的结果是使828.054999999702
四舍五入到828.06
。
发布于 2017-02-09 17:20:45
我不确定我是否完全理解你的问题,所以让我简单介绍一下:
double
值。在这种情况下,我建议您首先使用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
。我仍然不确定这是正确的方法,但你比我更了解你的需求:)
发布于 2017-02-09 17:11:48
考虑到您正在将其输出到字符串中,为什么不使用
String output = String.format(java.util.Locale.US,"%.2f", doubleValue);
而不是所有的DecimalFormat东西?这将使doubleValue保留为原始值,从而保持精度。
https://stackoverflow.com/questions/42142694
复制相似问题