R-devel mailing list 有人提过类似的问题 https://stat.ethz.ch/pipermail/r-devel/2003-July/027133.html,但是没有后文。
来做个计算:
<br />
> a <- 0.05:9.05<br />
> b <- (-10):9<br />
> r_1 <- matrix(a,nrow=length(b),ncol=length(a),byrow = TRUE)<br />
> r_2 <- matrix(b,nrow=length(b),ncol=length(a))<br />
> r_1+0.1*r_2<br />
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]<br />
# [1,] -0.95 0.05 1.05 2.05 3.05 4.05 5.05 6.05 7.05 8.05<br />
# [2,] -0.85 0.15 1.15 2.15 3.15 4.15 5.15 6.15 7.15 8.15<br />
# [3,] -0.75 0.25 1.25 2.25 3.25 4.25 5.25 6.25 7.25 8.25<br />
# [4,] -0.65 0.35 1.35 2.35 3.35 4.35 5.35 6.35 7.35 8.35<br />
# [5,] -0.55 0.45 1.45 2.45 3.45 4.45 5.45 6.45 7.45 8.45<br />
# [6,] -0.45 0.55 1.55 2.55 3.55 4.55 5.55 6.55 7.55 8.55<br />
# [7,] -0.35 0.65 1.65 2.65 3.65 4.65 5.65 6.65 7.65 8.65<br />
# [8,] -0.25 0.75 1.75 2.75 3.75 4.75 5.75 6.75 7.75 8.75<br />
# [9,] -0.15 0.85 1.85 2.85 3.85 4.85 5.85 6.85 7.85 8.85<br />
#[10,] -0.05 0.95 1.95 2.95 3.95 4.95 5.95 6.95 7.95 8.95<br />
#[11,] 0.05 1.05 2.05 3.05 4.05 5.05 6.05 7.05 8.05 9.05<br />
#[12,] 0.15 1.15 2.15 3.15 4.15 5.15 6.15 7.15 8.15 9.15<br />
#[13,] 0.25 1.25 2.25 3.25 4.25 5.25 6.25 7.25 8.25 9.25<br />
#[14,] 0.35 1.35 2.35 3.35 4.35 5.35 6.35 7.35 8.35 9.35<br />
#[15,] 0.45 1.45 2.45 3.45 4.45 5.45 6.45 7.45 8.45 9.45<br />
#[16,] 0.55 1.55 2.55 3.55 4.55 5.55 6.55 7.55 8.55 9.55<br />
#[17,] 0.65 1.65 2.65 3.65 4.65 5.65 6.65 7.65 8.65 9.65<br />
#[18,] 0.75 1.75 2.75 3.75 4.75 5.75 6.75 7.75 8.75 9.75<br />
#[19,] 0.85 1.85 2.85 3.85 4.85 5.85 6.85 7.85 8.85 9.85<br />
#[20,] 0.95 1.95 2.95 3.95 4.95 5.95 6.95 7.95 8.95 9.95<br />
> round(r_1+0.1*r_2,1)<br />
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]<br />
# [1,] -1.0 0.1 1.0 2.0 3.0 4.0 5.0 6.0 7.1 8.1<br />
# [2,] -0.8 0.2 1.1 2.1 3.1 4.1 5.1 6.1 7.2 8.2<br />
# [3,] -0.8 0.2 1.2 2.2 3.2 4.2 5.2 6.2 7.3 8.2<br />
# [4,] -0.6 0.4 1.3 2.3 3.3 4.3 5.3 6.3 7.4 8.4<br />
# [5,] -0.6 0.4 1.4 2.4 3.4 4.4 5.4 6.4 7.5 8.5<br />
# [6,] -0.4 0.6 1.5 2.5 3.5 4.5 5.5 6.5 7.6 8.6<br />
# [7,] -0.4 0.6 1.6 2.6 3.6 4.6 5.6 6.6 7.7 8.7<br />
# [8,] -0.3 0.8 1.7 2.8 3.8 4.8 5.8 6.8 7.8 8.8<br />
# [9,] -0.2 0.8 1.8 2.8 3.8 4.8 5.8 6.8 7.9 8.9<br />
#[10,] 0.0 1.0 1.9 2.9 3.9 5.0 6.0 7.0 8.0 9.0<br />
#[11,] 0.0 1.1 2.0 3.0 4.0 5.0 6.0 7.0 8.1 9.1<br />
#[12,] 0.2 1.2 2.1 3.1 4.1 5.1 6.1 7.1 8.2 9.2<br />
#[13,] 0.2 1.2 2.2 3.2 4.2 5.2 6.2 7.2 8.2 9.2<br />
#[14,] 0.4 1.4 2.3 3.3 4.3 5.3 6.3 7.3 8.4 9.4<br />
#[15,] 0.4 1.5 2.4 3.4 4.5 5.5 6.5 7.5 8.5 9.5<br />
#[16,] 0.6 1.6 2.5 3.5 4.5 5.5 6.5 7.5 8.6 9.6<br />
#[17,] 0.7 1.7 2.6 3.6 4.7 5.7 6.7 7.7 8.7 9.7<br />
#[18,] 0.8 1.8 2.8 3.8 4.8 5.8 6.8 7.8 8.8 9.8<br />
#[19,] 0.8 1.8 2.8 3.8 4.8 5.8 6.8 7.8 8.9 9.9<br />
#[20,] 1.0 2.0 2.9 3.9 5.0 6.0 7.0 8.0 9.0 10.0</p>
<p>
</p>
在上表中,4.45和0.15的计算情况不一样。
其中:
两个4.45的精确值不同,round结果不同
两个0.15的精确值相同,round结果相同。
皆遵守银行家舍入原则。
<br />
> sprintf("%.22f",(r_1+0.1*r_2)[5,6])#4.45精确值<br />
#[1] "4.4499999999999992894573"<br />
> round((r_1+0.1*r_2)[5,6], 1)#4.45舍入<br />
#[1] 4.4<br />
> sprintf("%.22f",(r_1+0.1*r_2)[15,5])#4.45精确值<br />
#[1] "4.4500000000000001776357"<br />
> round((r_1+0.1*r_2)[15,5], 1)#4.45舍入<br />
#[1] 4.5<br />
> sprintf("%.22f",(r_1+0.1*r_2)[12,1])#0.15精确值<br />
#[1] "0.1500000000000000222045"<br />
> round((r_1+0.1*r_2)[12,1], 1)#0.15舍入<br />
#[1] 0.2<br />
> sprintf("%.22f",(r_1+0.1*r_2)[2,2])#0.15精确值<br />
#[1] "0.1500000000000000222045"<br />
> round((r_1+0.1*r_2)[2,2], 1)#0.15舍入<br />
#[1] 0.2<br />
</p>
为啥直接赋值的数值(4.45、0.15)与计算得到的数值(4.45、0.15),求round结果不一样[s:16]
直接赋值的x = 0.15,为何精确值是0.1499999999999999944489[s:16]