如果值是200.3456,它应该格式化为200.34。 如果是200,那么它应该是200.00.
200.3456
200.34
200
200.00
四舍五入通常不是一个人想要的。相反,使用String.format()以所需的格式表示它。
String.format()
最简单的方法,就是做一个这样的魔术;
double val = ....; val = val*100; val = Math.round(val); val = val /100;
如果val从200.3456开始,那么它会变成20034.56,然后四舍五入到20035,然后我们除以它得到200.34。
如果你想总是四舍五入,我们可以通过转换为int型来截断:
double val = ....; val = val*100; val = (double)((int) val); val = val /100;
这种技术适用于大多数情况,因为对于非常大的double(正的或负的),它可能会溢出。但如果你知道你的值将在一个适当的范围内,那么这应该对你有用。
如果你只是想打印一个小数点后有两位数字的double,可以使用这样的代码:
double
double value = 200.3456; System.out.printf("Value: %.2f", value);
如果你想让结果以String的形式出现,而不是被打印到控制台,使用带有相同参数的String.format():
String
String result = String.format("%.2f", value);
或者使用类DecimalFormat:
DecimalFormat
DecimalFormat df = new DecimalFormat("####0.00"); System.out.println("Value: " + df.format(value));
在你的问题中,你似乎也想避免四舍五入的数字?我认为.format()将四舍五入的数字使用一半,afaik?< br > 因此,如果您想四舍五入,200.3456应该是200.35,精度为2。但在你的情况下,如果你只想要前两个,然后放弃剩下的?< / p >
您可以将其乘以100,然后转换为int(或取该数字的底),然后再除以100。
200.3456 * 100 = 20034.56; (int) 20034.56 = 20034; 20034/100.0 = 200.34;
你可能会在边界附近遇到非常非常大的数字。在这种情况下,转换为字符串和子字符串,它将很容易工作。
这里有一个实用程序,轮(而不是删除)是指定小数位数的双精度。
例如:
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))。感谢Sloin指出这一点。
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 = BigDecimal.valueOf(value); bd = bd.setScale(places, RoundingMode.HALF_UP); return bd.doubleValue(); }
注意,HALF_UP是“学校常用的”舍入模式。仔细阅读RoundingMode文档,如果你怀疑你需要其他东西,如银行家的舍入。
HALF_UP
float
999199.1231231235 == 999199.1231231236 // true 1.03 - 0.41 // 0.6200000000000001
# EYZ0。在此过程中,使用接受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")));
关于这个主题的一些优秀的进一步阅读:
如果您想要String 格式化而不是(或除了)严格的四舍五入数字,请参阅其他答案。
特别地,注意round(200, 0)返回200.0。如果你想输出“200.00”,你应该先四舍五入,然后格式化输出结果(这在Jesper的回答中有很好的解释)。
round(200, 0)
200.0
我认为这样比较简单:
double time = 200.3456; DecimalFormat df = new DecimalFormat("#.##"); time = Double.valueOf(df.format(time)); System.out.println(time); // 200.35
请注意,这实际上是为您进行舍入,而不仅仅是格式化。
对于两个四舍五入数字。非常简单,你基本上是更新变量,而不是只是显示的目的,DecimalFormat。
# EYZ0
例如,如果你真的想要相同的双精度,但以你想要的方式四舍五入,你可以使用BigDecimal
new BigDecimal(myValue).setScale(2, RoundingMode.HALF_UP).doubleValue();
value = (int)(value * 100 + 0.5) / 100.0;
double d = 28786.079999999998; String str = String.format("%1.2f", d); d = Double.valueOf(str);
double value= 200.3456; DecimalFormat df = new DecimalFormat("0.00"); System.out.println(df.format(value));
function Double round2(Double val) { return new BigDecimal(val.toString()).setScale(2,RoundingMode.HALF_UP).doubleValue(); }
注意toString()!!!!
这是因为BigDecimal转换double的精确二进制形式!!
这些是各种建议的方法及其失败的情况。
// 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;
请使用Apache通用数学:
Precision.round(10.4567, 2)