将双倍数转为3位有效数字

mh3*_*377 24 java rounding

有没有人知道如何将双倍数值转化为3个重要数字,如本网站上的示例

http://www.purplemath.com/modules/rounding2.htm

Sea*_*wen 68

double d = ...;
BigDecimal bd = new BigDecimal(d);
bd = bd.round(new MathContext(3));
double rounded = bd.doubleValue();
Run Code Online (Sandbox Code Playgroud)

  • 我认为你正在阅读这个问题,"我怎么能把它真实地表现为一个真实的双重圆形,并且完全代表双重的答案呢?" 你就在那里:你做不到.当然,我认为,这个问题的重点是"我如何在Java中找到3个重要数字,因为Math.round()是最接近的整数?" 我认为它更有可能,而且,这个问题的答案并非"无法完成". (8认同)
  • 你提出了一个不同的观点,我认为这对OP没有帮助.最好的答案不是,"没有什么可以用Java做的"; 就是上面的.'rounded'是对正确答案的最接近的双重表示.如果双精度是一个问题,那么整个问题确实没有意义!然后答案是使用BigDecimal. (6认同)
  • BigDecimal的值打印为"0.00100",这是完全正确的.我建议你试一试.MathContext这里与基数无关,而BigDecimal是一个任意精度的库. (4认同)
  • 尽管@ EJP的态度,他的基本观点是正确的:建议任何人阅读这个答案是非常重要的**,他们可能希望**留在BigDecimal** - 而不是做最后一行转换为最近的双倍值. (3认同)
  • 否.或者打印舍入%0.001的值并解释结果. (2认同)
  • 当然,BigDecimal就是这样做的,因为我在答案中说明了这一点.您的代码不起作用,因为您的"舍入"变量未舍入.我的问题是'round%0.001'的价值是多少.OP询问如何舍入双倍值.你没有回答任何一个问题.现在请解释为什么'舍入%0.001'如果'舍入'确实被舍入,则不会打印零. (2认同)
  • 附录(对于未来的读者):如果你想指定*小数位*的数量而不是*precision*,或整数有效位数,那么你必须使用像`bd.setScale(places,BigDecimal.ROUND_HALF_UP)这样的东西.代替.有关更多信息,请参阅[此答案](http://stackoverflow.com/a/2808648/56285). (2认同)

aww*_*smm 5

如果你想手动完成:

import java.lang.Math;

public class SigDig {

  public static void main(String[] args) {
    System.out.println("   -123.456   rounded up   to 2 sig figures is " + sigDigRounder(-123.456, 2,  1));
    System.out.println("     -0.03394 rounded down to 3 sig figures is " + sigDigRounder(-0.03394, 3, -1));
    System.out.println("    474       rounded up   to 2 sig figures is " + sigDigRounder(474, 2,  1));
    System.out.println("3004001       rounded down to 4 sig figures is " + sigDigRounder(3004001, 4, -1));
  }

  public static double sigDigRounder(double value, int nSigDig, int dir) {

    double intermediate = value/Math.pow(10,Math.floor(Math.log10(Math.abs(value)))-(nSigDig-1));

    if(dir > 0)      intermediate = Math.ceil(intermediate);
    else if (dir< 0) intermediate = Math.floor(intermediate);
    else             intermediate = Math.round(intermediate);

    double result = intermediate * Math.pow(10,Math.floor(Math.log10(Math.abs(value)))-(nSigDig-1));

    return(result);

  }
}
Run Code Online (Sandbox Code Playgroud)

上述方法将 double 舍入到所需的有效数字数,处理负数,并且可以明确告知向上或向下舍入