将双数舍入到2位小数
这个问题在这里已经有了答案:
这是一个实用程序,它将舍入 (而不是截断)双精度到指定的小数位数。
例如:
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;
}
这种情况在具有非常高的小数位数(例如round(1000.0d, 17)
)或大整数部分(例如round(90080070060.1d, 9)
)的角落情况下严重分解 。 感谢斯隆指出了这一点。
我一直在使用上面的内容来快速将“不太大”的双打翻倍到2或3个小数位(例如,为了记录目的,以秒为单位清理时间:27.987654321987 - > 27.99)。 但我认为最好避免这种情况,因为更可靠的方法很容易获得,代码也更清晰。
所以,改用它
(由路易Wasserman这个答案和肖恩欧文这个答案。)
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();
}
请注意, HALF_UP
是“在学校通常教授的”舍入模式。 仔细阅读RoundingMode文档,如果你怀疑你需要别的东西,比如银行家的舍入。
当然,如果你愿意的话,你可以将上述内容嵌入一行:
new BigDecimal(value).setScale(places, RoundingMode.HALF_UP).doubleValue()
并且在每一种情况下
请记住使用float
和double
浮点表示是不精确的。 例如,考虑这些表达式:
999199.1231231235 == 999199.1231231236 // true
1.03 - 0.41 // 0.6200000000000001
为了确切,你想使用BigDecimal 。 而在它的时候,使用带有String的构造函数,而不是使用double的构造函数。 例如,尝试执行此操作:
System.out.println(new BigDecimal(1.03).subtract(new BigDecimal(0.41)));
System.out.println(new BigDecimal("1.03").subtract(new BigDecimal("0.41")));
关于该主题的一些优秀进一步阅读:
float
和double
如果需要精确的答案” 如果你想要String格式化而不是严格舍入数字(或除此之外),请参阅其他答案。
具体来说,注意round(200, 0)
200.0
round(200, 0)
返回200.0
。 如果你想输出“ 200.00 ”,你应该先轮回,然后格式化输出的结果(这在Jesper的答案中有完美的解释)。
如果您只想在小数点后打印一个有两位数字的double
精度型,请使用如下所示的内容:
double value = 200.3456;
System.out.printf("Value: %.2f", value);
如果您希望将结果显示为String
而不是打印到控制台,请使用带相同参数的String.format()
:
String result = String.format("%.2f", value);
或者使用DecimalFormat
类:
DecimalFormat df = new DecimalFormat("####0.00");
System.out.println("Value: " + df.format(value));
我认为这很容易:
double time = 200.3456;
DecimalFormat df = new DecimalFormat("#.##");
time = Double.valueOf(df.format(time));
System.out.println(time); // 200.35
请注意,这实际上会对您进行四舍五入,而不仅仅是格式化。
链接地址: http://www.djcxy.com/p/85795.html