832.109は830
1.789は1.8
0.0141は0.014
つまり有効数字2桁をとりたいとき、ありませんか?
round使えば四捨五入できますが、指定できるのは「小数点以下第何位か?」ですので、上位3桁目を四捨五入して有効数字2桁で返すには他の方法が必要でした。
Rubyで有効数字を指定する方法:結論
ありそうなので車輪の再発明な気もしますが、見つけきらなかったのでメソッドで作成しました。
def significant_digits(num, digits)
return num if num.blank? || num.zero?
b = Math.log10(num.abs).floor
a = num.fdiv(10**b)
a.round(digits.to_i - 1)*(10**b)
end
numに丸めたい数字、digitsに有効数字何桁にしたいかを指定します。digitsにゼロ以下を入れると有効数字1桁になります。
>> significant_digits(832.109, 2)
830
>> significant_digits(1.789, 2)
1.8
>> significant_digits(0.014197, 2)
0.014
BigDecimalを使う方が正確な値が出るようです。誤差が問題になるようなら、リファクタリングしましょう。あと、flootを返すのではなく[a, b]を返すと良い場面もあるかもしれませんね。
はるすと
最後まで読んでくださってありがとうございました!
コメント