Jon*_*nik 760
下面是一个实用轮(而不是截断)双到小数位的指定数量.
例如:
round(200.3456, 2); // returns 200.35
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
这在具有非常高的小数位数(例如)或大整数部分(例如)的极端情况下严重崩溃.感谢Sloin指出这一点.round(1000.0d, 17)
round(90080070060.1d, 9)
我一直在使用上面的方法将"不太大"的双打多次绕到2或3个小数位(例如,为了记录目的,以秒为单位清理时间:27.987654321987 - > 27.99).但我想最好避免它,因为更可靠的方法随时可用,代码也更清晰.
(改编自Louis Wasserman的这个答案和肖恩欧文的这个答案.)
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();
}
Run Code Online (Sandbox Code Playgroud)
请注意,这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
Run Code Online (Sandbox Code Playgroud)
为了准确,您想要使用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")));
Run Code Online (Sandbox Code Playgroud)
关于该主题的一些优秀的进一步阅读
float
并且double
如果需要确切答案"如果您想要字符串格式而不是(或除此之外)严格舍入数字,请参阅其他答案.
具体来说,请注意round(200, 0)
返回200.0
.如果你想输出" 200.00 ",你应该首先进行舍入然后格式化输出的结果(这在Jesper的答案中得到了很好的解释).
Jes*_*per 317
如果您只想double
在小数点后打印两位数,请使用以下内容:
double value = 200.3456;
System.out.printf("Value: %.2f", value);
Run Code Online (Sandbox Code Playgroud)
如果要将结果放在a String
而不是打印到控制台,请使用String.format()
相同的参数:
String result = String.format("%.2f", value);
Run Code Online (Sandbox Code Playgroud)
或者使用课程DecimalFormat
:
DecimalFormat df = new DecimalFormat("####0.00");
System.out.println("Value: " + df.format(value));
Run Code Online (Sandbox Code Playgroud)
小智 121
我认为这更容易:
double time = 200.3456;
DecimalFormat df = new DecimalFormat("#.##");
time = Double.valueOf(df.format(time));
System.out.println(time); // 200.35
Run Code Online (Sandbox Code Playgroud)
请注意,这实际上会为您进行舍入,而不仅仅是格式化.
luk*_*uke 69
最简单的方法就是做这样的伎俩;
double val = ....;
val = val*100;
val = Math.round(val);
val = val /100;
Run Code Online (Sandbox Code Playgroud)
如果val从200.3456开始然后转到20034.56那么它将四舍五入到20035然后我们将它除以得到200.34.
如果你想要总是向下舍入,我们总是可以通过强制转换为int来截断:
double val = ....;
val = val*100;
val = (double)((int) val);
val = val /100;
Run Code Online (Sandbox Code Playgroud)
这种技术适用于大多数情况,因为对于非常大的双精度(正或负),它可能会溢出.但如果您知道您的价值观将在适当的范围内,那么这应该适合您.
Pri*_*tre 48
Precision.round(10.4567, 2)
Run Code Online (Sandbox Code Playgroud)
小智 36
function Double round2(Double val) {
return new BigDecimal(val.toString()).setScale(2,RoundingMode.HALF_UP).doubleValue();
}
Run Code Online (Sandbox Code Playgroud)
注意toString()!!!!
这是因为BigDecimal转换双精确二进制形式!
这些是各种建议的方法及其失败案例.
// 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;
Run Code Online (Sandbox Code Playgroud)
Abd*_*zmy 27
double value= 200.3456;
DecimalFormat df = new DecimalFormat("0.00");
System.out.println(df.format(value));
Run Code Online (Sandbox Code Playgroud)
小智 16
double d = 28786.079999999998;
String str = String.format("%1.2f", d);
d = Double.valueOf(str);
Run Code Online (Sandbox Code Playgroud)
dao*_*way 14
如果你真的想要相同的double,但是你想要的方式可以使用BigDecimal,例如
new BigDecimal(myValue).setScale(2, RoundingMode.HALF_UP).doubleValue();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1133898 次 |
最近记录: |