我没有在ruby中设置变量的日期类型。我使用默认数据类型,以使最终计算不准确。如何解决?
scores = params[:scores].split("\r\n").map { |n| n.to_f } # array of scores (at most 2 decimal points,e.g 2.32 ,23,65.76.....)
#new array
sd=Array.new(scores.length,0)
sd[0]= (scores[0]-average)**2 # calculation <<== sd[i] become 234.08999999999992
470.8900000000001
13.69000000000002
0.6399999999999955
86.48999999999995
sd[1]= (scores[1]-average)**2
sd[2]= (scores[2]-average)**2
sd[3]= (scores[3]-average)**2
sd[4]= (scores[4]-average)**2
sd_sum=sd[0]+sd[1]+sd[2]+sd[3]+sd[4]
sd_sum=sd_sum**2 ...
gg=sd_sum/5 # further calculation
ans=Math.sqrt(gg) # final answer for standard deviation
由于最终答案已经采取了许多计算步骤,因此变得不准确。
答案 0 :(得分:2)
要保持计算的准确性,请使用BigDecimal代替Float:
scores = params[:scores].split("\r\n").map { |n| BigDecimal(n) }
BigDecimal
提供非常大或非常准确的支持 浮点数。十进制算术对于一般计算也很有用,因为它 提供人们期望的正确答案 - 而正常二进制 浮点运算通常会引入细微的错误 基数10和基数2之间的转换。
答案 1 :(得分:2)
Ruby(或IEEE)浮点数是实数的近似值。可以在此处找到深入的解释:What Every Computer Scientist Should Know About Floating-Point Arithmetic。
不幸的是,浮点数显示为准确,这导致了很多混乱。如果显示完全值,则会更清楚:
2.32 #=> 2.319999999999999840127884453977458178997039794921875
23.0 #=> 23.0
65.76 #=> 65.7600000000000051159076974727213382720947265625
从上面的三个数字中,只有23.0
可以准确表示,其他两个是实际数字的近似值(一个稍微低于,另一个略高于上面)。我认为很明显,你无法从中获得准确的结果。