在Java中我有:
double x = 0.800000000000002
我想删除00000000000002格式x,我希望x值为0.8。
我不想使用小数格式,因为它将我的double转换为String。
我想将x保持为双倍。
答案 0 :(得分:1)
当然可以,但遗憾的是0.8
不能完全表示为双倍。
如果您想要任意精度,请使用类似BigDecimal
的类。 (但在我看来,由于Java缺乏对运算符重载的支持,类是一只猪使用。)
double
的一般规则是,它必须是一个适当大小的二元有理才能完美呈现。例如,0.5,0.25和所有整数,最大值为53的幂。
答案 1 :(得分:1)
double number =0.76432;
double value =Double.parseDouble(new DecimalFormat("##.##").format(number));
System.out.println(value);
根据您的使用情况使用。我想这会有所帮助。
答案 2 :(得分:1)
避免字符串格式化的解决方案是:
double
值,例如Math.ceil()
,Math.floor()
或Math.rint()
。例如,如果要将双精度数转换为两位小数:
double x = 0.800000000000002;
System.out.println(x); // 0.800000000000002
x = Math.rint(x * 100) / 100;
System.out.println(x); // 0.8
该概念也可用于四舍五入和类似的舍入,可用于故障计算的研究。
你可以将它放在一个库中,如下所示:
public enum Round {;
public static double round(final double x, final int decimalPrecision) {
round(x, decimalPrecision, Math::rint);
}
public static double roundUp(final double x, final int decimalPrecision) {
round(x, decimalPrecision, Math::ceil);
}
public static double roundDown(final double x, final int decimalPrecision) {
round(x, decimalPrecision, Math::floor);
}
public static double round(final double x, final int decimalPrecision, final Function<Double, Double> round) {
return round.apply(x * decimalPrecision) / decimalPrecision);
}
}
注意:请记住,双精度数基于2的幂。并非所有十进制值都可以用双精度表示,它们只是近似值。
警告:我尚未测试上述代码。