Dzień dobry wszystkim,Ruby matematyki zmiennoprzecinkowej - Problem z precyzja Suma Calc
Mam pewne problemy z matematyką liczb zmiennoprzecinkowych i zdobyć całkowicie zagubiony w „.to_f” 's «* 100» 's i ".0"!
Miałem nadzieję, że ktoś może mi pomóc z moim konkretnym problemem, a także wyjaśnić dokładnie, dlaczego ich rozwiązanie działa, tak, że rozumiem to na następny raz.
Mój program musi zrobić dwie rzeczy:
- Sum listę miejsc po przecinku, określenia, czy sumują się dokładnie 1,0
- Określić różnicę między 1,0 a sumę liczb - ustawić wartość zmienna na dokładną różnicę, aby suma wynosiła 1,0.
Na przykład:
[0,28, 0,55, 0,17] -> powinny sumować się do 1,0, jednak wciąż otrzymuję 1.xxxxxx. Jestem wykonawczych sumę w następujący sposób:
sum = array.inject(0.0){|sum,x| sum+ (x*100)}/100
Powodem potrzebuję tej funkcji jest to, że czytam w zestawie dziesiętnych, które pochodzą z programu Excel. Nie są one w 100% dokładne (brakuje im dziesiętnych punktów), więc suma zwykle wynosi 0,999999xxxxx lub 1.000xxxxx. Na przykład, będę się wartości jak poniżej:
0.568887955,0.070564759,0.360547286
Aby rozwiązać ten problem, jestem w porządku biorąc sumę pierwszych n-1 liczb, a następnie zmianę ostatecznej liczby lekko tak, że wszyscy liczby razem sumują się do 1,0 (muszą spełniać walidację za pomocą powyższego równania lub cokolwiek kończę). Jestem obecnie wdrożenie to w następujący sposób:
sum = 0.0
array.each do |item|
sum += item * 100.0
end
array[i] = (100 - sum.round)/100.0
wiem, co mogłem zrobić to z inject, ale starałem się grać z nim, aby zobaczyć, co działa. Myślę, że to na ogół działa (od sprawdzania wyników), ale nie zawsze spełnia powyższą sumę walidacji. Więc jeśli zajdzie taka potrzeba, mogę też to zmienić. Zauważ, że potrzebuję tylko dwóch dziesiętnych dokładności w tych liczbach - 0,56, a nie 0,5623225. Mogę je zaokrąglić w czasie prezentacji lub podczas obliczeń ... Nie ma to dla mnie znaczenia.
Dziękuję BARDZO ZA POMOC!
Dzięki! Pomocna odpowiedź. – Brandon