我只想将数字四舍五入到两位数,写了下面的代码:
Double input = 17.755;
DecimalFormat twoDigitDecimalFormat = new DecimalFormat("0.00");
Double output = Double.valueOf(twoDigitDecimalFormat.format(input));
我期待输出应该是
17.76
但它只给我17.75
,对于所有其他情况它工作得很好,但只有这个数字不起作用,如果我在输入中再添加一个数字,说17.7551
然后四舍五入到 17.76
首先,您的最终值是
Double
它没有 2 位数字! 当您执行 Double.valueOf 时,它将成为 最接近的可表示值。如果你真的想要 Java 中的两位数字,那么你需要使用 BigDecimal,它实际上存储以 10 为底的浮点表示形式。
诀窍是,你使用的价值并不是你想象的那样。
double d = 17.755;
Java 双精度数是 2 指数的幂,所以一个数字看起来是十进制的精确值,但在浮点数中有重复表示。这意味着它需要被截断并使用最接近的值。
jshell> double d = 17.755;
d ==> 17.755
jshell> var x = new BigDecimal(d);
x ==> 17.754999999999999005240169935859739780426025390625
jshell> var y = new BigDecimal("17.755");
y ==> 17.755
现在你可以看到
x
是 d
的精确表示实际上小于 17.755
所以当你舍入它时它会 down.
另一方面,y
正好是 17.755,将根据您应用的规则四舍五入。
jshell> System.out.printf("%.2f\n", y);
17.76
jshell> System.out.printf("%.2f\n", x);
17.75