用 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
。我仍然不确定这是正确的舍入方式,但你比我更了解你的要求:)
用于获取“.”后恰好有 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
。我仍然不确定这是正确的舍入方式,但你比我更了解你的要求:)