double值出现异常行为的原因是什么?

时间:2018-06-27 16:28:47

标签: java floating-point

我创建了一个二维数组来存储 double 值,在执行以下代码时,某些值的十进制范围被意外修改了!

library(tidygraph)
library(visNetwork)

# sample graph
g <- tidygraph::create_tree(8,2) %>% 
  activate(nodes) %>% 
  mutate(Employee = LETTERS[1:8],
         Grade = c(0,1,1,1,2,2,2,2),
         label = paste("Emp",Employee,"Grade",Grade)
         )

visIgraph(g,layout="layout_as_tree", flip.y=F,idToLabel = F)

g %>% activate(nodes) %>% 
  mutate(Approver = map_bfs_back(node_is_root(),.f = function(node,path,...){
    #If starting node grade - node grade >= 2 then Approver Employee ID
  }))

}

输出:

package learnJavaProj;
public class SquareRootin2D {

public static void main(String[] args) {

    double [][] arr = new double[10][10];
    double f= 0.00;
    double g=0.00;

    for(int i=0;i<10;i++)
    {
        for(int j=0;j<10;j++)
        {
            arr[i][j]=0.00;
        }
    }

    for (int i=0;i<10;i++)
    {
        arr[i][0]=f;
        arr[0][i]=g;
        g=g+0.10;
        f++;
    }
    for(int i=0;i<10;i++)
    {
        for(int j=0;j<10;j++)
        {
            System.out.print(arr[i][j]+"     ");
        }
        System.out.println("\n");
    }
}

使用float时也会出现这种波动! 请解释这种混乱。 谢谢!

1 个答案:

答案 0 :(得分:1)

Java默认情况下不完全显示浮点值。 The default is to display just enough digits to uniquely distinguish the value.

其结果是某些值可能显示为“ 0.1”和“ 0.2”,但与正好为0.1和0.2的差别很小。添加它们时,这些差异会合并并变得更大。然后,该总和与0.3的差异就足够大,以至于要将其与显示为“ 0.3”的值区分开来,需要使用“ 0.30000000000000004”。

在源代码中使用0.1时,它将转换为0.1000000000000000055511151231257827021181583404541015625,这是在IEEE-754基本64位二进制浮点中可以表示的最接近0.1的值。同样,0.2变成0.200000000000000011102230246251565404236316680908203125,而0.3变成 0.299999999999999988897769753748434595763683319091796875

当您将0.10.2的两个值相加时,计算结果为0.3000000000000000444089209850062616169452667236328125。由于此值不是0.299999999999999988897769753748434595763683319091796875,因此必须将其打印为“ 0.30000000000000004”以区分它。