Java - DecimalFormat 不四舍五入到 2 位数

问题描述 投票:0回答:1

我只想将数字四舍五入到两位数,写了下面的代码:

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

java math decimal rounding decimalformat
1个回答
0
投票

首先,您的最终值是

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
© www.soinside.com 2019 - 2024. All rights reserved.