浮点使计算不准确

时间:2017-01-24 07:04:36

标签: ruby-on-rails ruby floating-point floating-accuracy

我没有在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 

由于最终答案已经采取了许多计算步骤,因此变得不准确。

2 个答案:

答案 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可以准确表示,其他两个是实际数字的近似值(一个稍微低于,另一个略高于上面)。我认为很明显,你无法从中获得准确的结果。