【发布时间】:2017-06-08 21:15:57
【问题描述】:
我在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
由于最终的答案经过了许多步骤的计算,它变得不准确。
【问题讨论】:
-
“我没有设置数据类型” – 你可能不知道,但你做到了:
n.to_f明确地将n转换为浮点数。 -
@Stefan 浮点数指无限小数点? -->不准确的计算-->避免在计算中使用?
-
浮点数是近似值,请参阅下面的答案。
-
我认为您的代码可能是错误的:您不需要平方
sd_sum,而且尚不清楚average的来源。除了少数极端情况(例如所有值都相同,或者您的值非常大)之外,浮点错误通常应该是相当小的。 -
@Simon Byrne 我简化了代码。不用担心
标签: ruby-on-rails ruby floating-point floating-accuracy