Java - 四舍五入到小数点后两位

Java - rounding double to 2 decimal places

我知道这个问题已经被问过很多次了,但我卡住了,我不知道正确的解决方案应该是什么。我正在编写一个程序,其中有很多数字乘法。结果必须四舍五入到小数点后两位,但有时结果不正确。

例如: 我有两个双打 v1=99.338 和 v2=732.5.

我想将它们相乘并将结果四舍五入到小数点后两位。 正确的结果是 72765.085 所以四舍五入后它应该是 72765.09 但是在计算机中结果是 72765.08499999999 并且所有的四舍五入方法都给出 72765.08 这显然是错误的。

例如

double x= v1 * v2; //x=72765.08499999999

    DecimalFormat dec= new DecimalFormat("0.00");
    decsetRoundingMode(RoundingMode.HALF_UP);
    String v = dec.format(x);

给出 72765.08。此示例中的 RoundingMode.CEILING 工作正常,但 v 和 v2 的其他值是错误的。

NumberFormat nf= NumberFormat.getInstance();
nf.setMaximumFractionDigits(2);
nf.format(x);

给出 72765.08。

BigDecimal big = new BigDecimal(x, setScale(2, RoundingMode.HALF_UP);
double v = decWartosc.format(x);

给出 v=72765.08。 还有其他想法吗?

我已经在 C# 中试过了,结果是正确的。

首先99.337 * 732.5 = 72764.3525,然后NOT 72765.085

现在,这段代码:

BigDecimal b1 = new BigDecimal("99.337");
BigDecimal b2 = new BigDecimal("732.5");
BigDecimal result = b1.multiply(b2).setScale(2, RoundingMode.HALF_UP);
System.out.println(result);

输出:

72764.35

您必须使用 BigDecimal 进行计算。

BigDecimal exact = BigDecimal.valueOf(v1).multiply(BigDecimal.valueOf(v2));
BigDecimal big = exact.setScale(2, RoundingMode.HALF_UP);
System.out.println(big.toString());