我创建了一个二维数组来存储 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时也会出现这种波动! 请解释这种混乱。 谢谢!
答案 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.1
和0.2
的两个值相加时,计算结果为0.3000000000000000444089209850062616169452667236328125。由于此值不是0.299999999999999988897769753748434595763683319091796875,因此必须将其打印为“ 0.30000000000000004”以区分它。