舍入一个2位小数位

问题:

如果值为200.3456,则应格式化为200.34
如果是200,则应该是200.00

回答:

这是一个实用程序,(而不是truncating)一个双倍到指定的小数位数。
例如:

round(200.3456, 2); // returns 200.35

原版;注意这个

public static double round(double value, int places) {
    if (places < 0) throw new IllegalArgumentException();

    long factor = (long) Math.pow(10, places);
    value = value * factor;
    long tmp = Math.round(value);
    return (double) tmp / factor;
}
&#91;/code&#93;
这个<strong>坏了</strong>在小数位数非常多(例如<code>round(1000.0d, 17)</code>)或大整数部分(例如<code>round(90080070060.1d, 9)</code>)的情况下。感谢<a href="https://stackoverflow.com/users/306488/sloin">Sloin</a>指出这一点。
我一直在使用上面的方式将“不太大”的双打,以高达2位或3位的小数位数表达多年(例如,为了清理时间,以秒为单位进行记录:27.987654321987  - > 27.99)。但是我猜想最好避免这种情况,因为更可靠的方法可以很方便地使用,而且更清晰的代码。
<h1>所以,使用这个</h1>
(改编自<a href="https://stackoverflow.com/a/15643364/56285">this answer by Louis Wasserman</a>和<a href="https://stackoverflow.com/a/7548871/56285">this one by Sean Owen</a>)

public static double round(double value, int places) {
    if (places < 0) throw new IllegalArgumentException();

    BigDecimal bd = new BigDecimal(value);
    bd = bd.setScale(places, RoundingMode.HALF_UP);
    return bd.doubleValue();
}
&#91;/code&#93;
请注意,<code>HALF_UP</code>是“通常在学校教书”的舍入模式。仔细阅读<a href="http://docs.oracle.com/javase/7/docs/api/java/math/RoundingMode.html" rel="noreferrer">RoundingMode documentation</a>,如果你怀疑你需要别的东西,如<a href="http://en.wikipedia.org/wiki/Rounding#Round_half_to_even" rel="noreferrer">Bankers’ Rounding</a>
当然,如果你愿意,你可以将上面的内容列入一行:<br/> <code>new BigDecimal(value).setScale(places, RoundingMode.HALF_UP).doubleValue()</code>
<h1>在每一种情况下</h1>
请记住,使用<code>float</code>和<code>double</code>的浮点表示是<em>inexact</em>。
例如,考虑这些表达式:

999199.1231231235 == 999199.1231231236 // true
1.03 - 0.41 // 0.6200000000000001

 。而在它,它使用构造函数接受一个String,从来没有一个双倍。例如,尝试执行以下操作:

System.out.println(new BigDecimal(1.03).subtract(new BigDecimal(0.41)));
System.out.println(new BigDecimal("1.03").subtract(new BigDecimal("0.41")));

一些优秀的进一步阅读主题:

如果您想要String formatting而不是(或除此之外)严格舍入数字,请参阅其他答案。
具体来说,请注意round(200, 0)返回200.0。如果要输出“200.00”,则应先舍入,然后格式化输出结果(在Jesper's answer中完美解释)。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Round a double to 2 decimal places

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

+ 80 = 82