所以今天我发现了一些意想不到的东西:
long a = 1234567890000l;
float b = 1.2f;
long result_a = (long)(a - b * 1000);
long result_b = a - ((long) (b * 1000));
System.out.println("result_a: " + result_a);
System.out.println("result_b: " + result_b);
你会期望result_a和result_b是相似的(不完全相同,因为b是浮点数而且根据定义不精确),对吧?对??好吧,不......
result_a: 1234567954432
result_b: 1234567888800
不知道为什么会有巨大的差异。任何想法的家伙?
答案 0 :(得分:-1)
float
和double
遇到与二进制格式的内部表示有关的问题,带有有效数和系数。
要解决此问题,您需要避免使用float
和double
来精确(在程序员选择的级别)计算。
您可以改用BigDecimal
。
来自javadoc
不可变,任意精度的有符号十进制数。
只是为了显示double和float的问题,对于小值,请考虑以下代码:
if (1.0 - 0.6 - 0.3 - 0.1 == 0.0) {
// Will never enter here
}
测试为false
,因为操作 1.0 - 0.6 - 0.3 - 0.1
不为零,但由于四舍五入问题,值接近于零。