四舍五入到小数点后两位

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

这里是一个实用工具,它将舍入 (而不是截断 )一个double指定的小数位数。

例如:

 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) )的angular落情况下严重分解 。 感谢斯隆指出这一点。

我一直在用上面的方法来快速地把“不太大”的双打翻转成两到三个小数位(例如为了logging的目的,以秒为单位清理时间: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是“通常在学校教授”的舍入模式。 仔细阅读RoundingMode文档 ,如果你怀疑你需要别的东西,比如银行家舍入 。

当然,如果你愿意的话,你可以把上面的内容embedded一行:
new BigDecimal(value).setScale(places, RoundingMode.HALF_UP).doubleValue()

而且在任何情况下

请记住使用floatdouble浮点表示是不精确的 。 例如,考虑这些expression式:

 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"))); 

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

  • 第48项:Joshua Bloch在Effective Java (第2版)中的“避免floatdouble如果需要精确的答案”
  • 每个程序员应该知道什么是浮点运算

如果你想要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 

请注意,这实际上会为您做四舍五入,而不仅仅是格式化。

最简单的方法就是这样做;

 double val = ....; val = val*100; val = Math.round(val); val = val /100; 

如果val从200.3456开始,那么它会到2003年4.56,然后四舍五入到20035,然后我们把它分成200.34。

如果你想总是舍入,我们总是可以通过转换为int来截断:

 double val = ....; val = val*100; val = (double)((int) val); val = val /100; 

这种技术将适用于大多数情况下,因为对于非常大的双打(正面或负面)它可能溢出。 但如果你知道你的价值观将在一个适当的范围内,那么这应该为你工作。

请使用Apache公共math :

 Precision.round(10.4567, 2) 
 function Double round2(Double val) { return new BigDecimal(val.toString()).setScale(2,RoundingMode.HALF_UP).doubleValue(); } 

注意toString()!!!!

这是因为BigDecimal转换了双精确的二进制forms!

这些是各种build议的方法及其失败案例。

 // Always Good! new BigDecimal(val.toString()).setScale(2,RoundingMode.HALF_UP).doubleValue() Double val = 260.775d; //EXPECTED 260.78 260.77 - WRONG - new BigDecimal(val).setScale(2,RoundingMode.HALF_UP).doubleValue() Double val = 260.775d; //EXPECTED 260.78 260.77 - TRY AGAIN - Math.round(val * 100.d) / 100.0d Double val = 256.025d; //EXPECTED 256.03d 256.02 - OOPS - new DecimalFormat("0.00").format(val) // By default use half even, works if you change mode to half_up Double val = 256.025d; //EXPECTED 256.03d 256.02 - FAIL - (int)(val * 100 + 0.5) / 100.0; 

如果你真的想要同样的double,但是按照你想要的方式舍入,你可以使用BigDecimal

 new BigDecimal(myValue).setScale(2, RoundingMode.HALF_UP).doubleValue(); 
 double value= 200.3456; DecimalFormat df = new DecimalFormat("0.00"); System.out.println(df.format(value)); 
 double d = 28786.079999999998; String str = String.format("%1.2f", d); d = Double.valueOf(str); 

四舍五入通常不是人们想要的。 而是使用String.format()以所需的格式表示它。

两位舍入数字。 非常简单,你基本上是更新variables,而不是显示DecimalFormat的目的。

x = Math.floor(x * 100) / 100;

在你的问题,似乎你想避免数字四舍五入? 我认为.format()将使用half-up,afaik四舍五入?
所以如果你想四舍五入,200.3456应该是200.35,精度为2.但是在你的情况下,如果你只是想要第一个2,然后放弃其余的… ??:

你可以将它乘以100,然后投到一个整数(或取数字的底部),然后再除以100。

200.3456 * 100 = 20034.56;
(int)20034.56 = 20034;
20034 / 100.0 = 200.34;

尽pipe你可能会遇到真正的大数字问题。 在这种情况下,转换为一个string和子string就可以很容易地工作。

 value = (int)(value * 100 + 0.5) / 100.0;