みんなおはよう、
浮動小数点演算で問題が発生し、「。to_f」、「* 100」、「。0」で完全に失われました。
私は誰かが私の特定の問題について私を助けてくれることを望んでいました。また、次回のためにこれを理解できるように、彼らの解決策が機能する理由を正確に説明してください。
私のプログラムは2つのことをする必要があります:
- 小数のリストを合計し、合計が正確に1.0になるかどうかを判断します
- 1.0と数値の合計の差を決定します-変数の値を正確な差に設定して、合計が1.0になるようにします。
例えば:
[0.28、0.55、0.17]->合計は1.0になるはずですが、1.xxxxxxを取得し続けます。私は次の方法で合計を実装しています:
sum = array.inject(0.0){|sum,x| sum+ (x*100)} / 100
この機能が必要な理由は、Excelからの小数のセットを読み取っているからです。これらは100%正確ではないため(小数点が不足しています)、通常、合計は0.999999xxxxxまたは1.000xxxxxになります。たとえば、次のような値を取得します。
0.568887955,0.070564759,0.360547286
これを修正するには、最初のn-1の数値の合計を取り、最後の数値を少し変更して、すべての数値の合計が1.0になるようにします(上記の式を使用した検証、または最終的には何でも満たす必要があります) )。私は現在、これを次のように実装しています。
sum = 0.0
array.each do |item|
sum += item * 100.0
end
array[i] = (100 - sum.round)/100.0
インジェクトでこれができることは知っていますが、何が機能するかを確認するためにそれを試してみました。これは(出力の検査から)一般的に機能していると思いますが、上記の検証合計を常に満たすとは限りません。したがって、必要に応じて、これも調整できます。これらの数値には、小数点以下2桁の精度しか必要ないことに注意してください。つまり、0.5623225ではなく0.56です。プレゼンテーション時、またはこの計算中に切り捨てることができます...私には関係ありません。
ご助力ありがとうございます!