如何在不取整的情况下格式化Java中的双输入



我读过这个问题,将小数点后两位舍入到两位。它展示了如何对数字进行舍入。我想要的只是简单的格式,只打印小数点后两位。我所拥有的和我所尝试的:

double res = 24.695999999999998;
DecimalFormat df = new DecimalFormat("####0.00");
System.out.println("Value: " + df.format(res)); //prints 24.70 and I want 24.69
System.out.println("Total: " + String.format( "%.2f", res )); //prints 24.70

因此,当我有24.695999999999998时,我想将其格式化为24.69

您需要首先获取双值的floor,然后对其进行格式化。

数学楼层(双人)

返回小于或等于参数且等于数学整数的最大(最接近正无穷大)双精度值。

所以使用类似的东西

double v = Math.floor(res * 100) / 100.0;

其他备选方案包括使用BigDecimal

public void test() {
    double d = 0.29;
    System.out.println("d=" + d);
    System.out.println("floor(d*100)/100=" + Math.floor(d * 100) / 100);
    System.out.println("BigDecimal d=" + BigDecimal.valueOf(d).movePointRight(2).round(MathContext.UNLIMITED).movePointLeft(2));
}

打印

d=0.29
floor(d*100)/100=0.28
BigDecimal d=0.29

将数字乘以100并强制转换为整数。这会截断除所需的两个之外的所有十进制空格。将结果除以100.00。(24.69).

int temp = (int)(res * 100);
double result = temp / 100.00;

或者一行代码中的相同内容:

double result = ((int)(res * 100)) / 100.00;

除了使用Math.floor(double)和计算小数位数(例如,两个小数点的* 100/ 100.0)外,您还可以使用BigDecimal,然后像一样调用setScale(int, int)

double res = 24.695999999999998;
BigDecimal bd = BigDecimal.valueOf(res);
bd = bd.setScale(2, RoundingMode.DOWN);
System.out.println("Value: " + bd);

这也会给你(要求的)

Value: 24.69

最新更新