慕斯王
这里有一个实用程序子弹(而不是截断)双到指定的小数位数。例如: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)。但是我想最好避免它,因为更可靠的方法是现成的,还有更干净的代码。所以,用这个代替(改编自这是路易斯·沃瑟曼的回答和这张是肖恩·欧文写的.)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是四舍五入的教学模式。仔细阅读圆模式文档,如果你怀疑你需要其他的东西,比如银行家四舍五入.当然,如果您愿意,可以将上面的内容内联成一行:new BigDecimal(value).setScale(places, RoundingMode.HALF_UP).doubleValue()在任何情况下始终记住,浮点表示使用float和double是不准确..例如,考虑以下表达式:999199.1231231235 == 999199.1231231236 // true1.03 - 0.41 // 0.6200000000000001为了准确起见,您想使用BigDecimal..在此过程中,使用接受字符串的构造函数,而不是接受双字符串的构造函数。例如,尝试执行以下操作:System.out.println(new BigDecimal(1.03).subtract(new BigDecimal(0.41)));System.out.println(new BigDecimal("1.03").subtract(new BigDecimal("0.41")));关于这一专题的一些极好的进一步阅读:项目48:“避免float和double如果需要确切的答案“有效Java(第二版)关于浮点算法,每个程序员都应该知道些什么?如果你想要字符串格式化而不是(或除了)严格四舍五入的数字,请参阅其他答案。具体来说,请注意round(200, 0)回报200.0..如果你想输出“200.00“,您应该先进行一轮,然后格式化输出结果(如杰斯珀的回答).