首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >打印数字2位,圆6位精度

打印数字2位,圆6位精度
EN

Stack Overflow用户
提问于 2017-02-09 17:05:23
回答 2查看 2.2K关注 0票数 0

后面有两个位数的字符串。我可以做这样的事情:

代码语言:javascript
运行
复制
        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“,它会把它归结为零。

但是,如果我需要保持更多的数字精度,只是不想显示出来呢?

我很快就创建了这个工作代码:

代码语言:javascript
运行
复制
        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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-09 17:20:45

我不确定我是否完全理解你的问题,所以让我简单介绍一下:

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

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

代码语言:javascript
运行
复制
double value = 1.23456789;
BigDecimal rounded = BigDecimal.valueOf( value ).setScale(6, RoundingMode.HALF_UP);

这应该会导致值1.234568

然后像以前一样使用NumberFormat,但始终是这样的:

代码语言:javascript
运行
复制
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()调用来实现它:

代码语言:javascript
运行
复制
BigDecimal rounded = BigDecimal.valueOf( value );
for( int digit = 6; digit >= 2; digit--) {
  rounded = rounded .setScale( digit, RoundingMode.HALF_UP );
}

这应该适用于分数数字6,然后5等,最后圆整到4.24。我仍然不确定这是正确的方法,但你比我更了解你的需求:)

票数 3
EN

Stack Overflow用户

发布于 2017-02-09 17:11:48

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

代码语言:javascript
运行
复制
String output = String.format(java.util.Locale.US,"%.2f", doubleValue);

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42142694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档