【问题标题】:In Java, how to achieve this type of number rounding?在Java中,如何实现这种数字舍入?
【发布时间】:2014-05-20 18:39:22
【问题描述】:

我正在编写一个小型物理应用程序。我打算做的是进行数字四舍五入。问题在于它不是固定舍入,而是取决于小数位数的值的可变舍入。我会解释这个问题。

  • 我总是需要保留整个整数部分(如果有)和前五位小数(如果有)。
  • 始终使用四舍五入。

    21.1521421056 变为 21.15214
    34.1521451056 变为 34.15215

  • 如果结果只包含十进制数字,则:

    • 如果前五位数字包括非零数字,则保留它们。

      0.52131125 变为 0.52131
      0.21546874 变为 0.21547
      0.00120012 变成 0.0012

    • 如果前五位都是零位 0.00000 则下降到包括非零位的前五位。

      0.0000051234 变为 0.0000051234
      0.000000000000120006130031 变为 0.00000000000012001

我需要在使用BigDecimal 时进行此舍入,因为这是我的需要。

【问题讨论】:

  • 看来您必须手动完成(编写自己的代码),我认为没有一种方法可以进行这种特定类型的舍入(但我可能错了)。
  • 我同意这很奇怪,以至于您必须进行一些编码...但是BigDecimal 是一个很好的基础;只需根据值将比例设置为您需要的值。
  • @Cruncher if >4 places right of the first non-zero> 与我的解释一致;包括非零数字的前五位数字(点之后)。那么就OK了。

标签: java decimal rounding


【解决方案1】:

如果我正确理解您想要的内容,我认为这将起作用,基于实验。如果d 是包含数字的BigDecimal

BigDecimal rounded = d.round(new MathContext
    (d.scale() - d.precision() < 5 
        ? d.precision() - d.scale() + 5 
        : 5));

【讨论】:

  • 哇,我不敢相信这行得通。请提供解释以使其成为一个很好的答案。特别是因为scale()precision() 上的文档并不完美。
  • @Cruncher 我也不懂这些方法。我只是转储了 new MathContext 参数的各种值的输出,并找出了哪个可以使它起作用以及公式的样子。
  • 乍一看,它们可能用于 BigDecimal 的内部实现,作者认为他们不妨将其作为公共 api 提供。并且没有决定编写像样的文档。 (unscaledValue由scale定义,scale由unscaledValue定义)
【解决方案2】:

这就是你要找的吗?

public static void main(String[] args){
     double d = 0.000000000000120006130031;

     System.out.println(round(d, 5));
 }

 private static double round(double d, int precision) {
    double factor = Math.pow(10D, precision);
    int value = (int)d;
    double re = d-value;


    if (re * factor <= 0.1 && d != 0) {
        while (re * factor <= 0.1) {
            factor *= 10;
        }
        factor *= Math.pow(10D, precision);
    }
    re = ((int)(re*factor))/factor+value;

    return re;
}

(抱歉,它有点快和肮脏,但如果你愿意,可以改进它)

编辑: 在条件下使其成为&lt;=,这应该会更好

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多