具有long和float数据类型的Java算法

时间:2016-02-24 07:50:48

标签: java floating-point algebraic-data-types

所以今天我发现了一些意想不到的东西:

    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

不知道为什么会有巨大的差异。任何想法的家伙?

1 个答案:

答案 0 :(得分:-1)

floatdouble遇到与二进制格式的内部表示有关的问题,带有有效数和系数。

要解决此问题,您需要避免使用floatdouble来精确(在程序员选择的级别)计算。 您可以改用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不为零,但由于四舍五入问题,值接近于零。