我对浮点值的舍入有疑问。
以下代码给了我以下结果:
public class ProductOrder {
public static void main(String[] args) {
int q = 48;
float p = 6.95f;
System.out.println(q * p);
}
------
Output: 333.59998
虽然预期的结果应该是 333.6
当我用 49 替换 q 时,没关系,我得到 340,55
我对浮点值的舍入有疑问。
以下代码给了我以下结果:
public class ProductOrder {
public static void main(String[] args) {
int q = 48;
float p = 6.95f;
System.out.println(q * p);
}
------
Output: 333.59998
虽然预期的结果应该是 333.6
当我用 49 替换 q 时,没关系,我得到 340,55
正如已经指出的那样,BigDecimal 专为精确处理短小数部分特别重要的情况而设计,并且比任何二进制浮点格式更适合这些情况。
第二个最好的解决方案是在例如整数美分中工作,并且仅在显示期间插入小数点。
如果您必须使用二进制浮点,则 double 通常是比 float 更好的选择,除非您要处理大量数字并且知道 float 具有足够的精度。
对于输出,如果您期望结果的小数点后不超过 2 个小数位,您可以使用 DecimalFormat 进行相应的舍入:
导入 java.text.DecimalFormat;
public class Test {
public static void main(String[] args) {
DecimalFormat df = new DecimalFormat("#0.##");
int q = 48;
float p = 6.95f;
System.out.println(df.format(q * p));
}
}
打印 333.6
默认格式会产生最少数量的数字,这些数字是从其邻居中区分数字所需的。这意味着如果结果由于舍入误差而略微偏离,您将获得“丑陋”的输出。
解决此问题的一种方法是使用精确算术(BigDecimal 或整数算术)。另一个是舍入输出,例如:
System.out.printf("%f", p*q);
该数字333.6
不能完全表示为 a float
,其精度高达 6 位小数。当您尝试以太高的精度(8 位)打印它时,会显示潜在的舍入误差。
double
具有高达 15 位的精度。
但是,正如其他人指出的那样,如果您正在处理财务计算,您应该在BigDecimal
.
作为参考,您可以使用IEEE-754 浮点转换float
网站来查看对于任何给定的十进制数,它在和中的确切表示方式double
。
这里的问题是浮点会受到浮点精度误差的影响。你可以使用double
两倍的精度(你最终还是会得到错误,但它比使用更准确float
)。
例如
public static void main(String[] args) {
int q = 48;
double p = 6.95;
System.out.println(q * p);
}