2015-08-03 4 views
0

Как определить количество цифр после десятичной точки.счетчик точности clojure

[ 1.6712 2.053 3.52 ] 
;;1.6712 => 4 
;;2.053 => 3 
;;3.52 => 2 
+2

Нет такой вещи, как «количество цифр после десятичного числа». Вы имеете в виду десятичные знаки в строчном представлении числа? В этом случае 2,050 составляет 2,05, поэтому он имеет два десятичных знака. Что вы пытаетесь сделать точно и почему важно число десятичных знаков? –

+0

Чтобы определить число, имеющее более 5-ти десятичных знаков – Ezekiel

+1

В чем заключается основная проблема? Имейте в виду, что число цифр не соответствует точности значения (например, 1.2500 = 1.25 = 5/4 точнее, чем 1.3333 (4/3), хотя 1.25 требуется всего 2 десятичных знака. –

ответ

1

Имейте в виду: What Every Computer Scientist Should Know About Floating-Point Arithmetic

Так тривиальное/математическая попытка может быть.

Но это не сработает для каждого двойника!

(defn more-than-5 [number] 
    (let [n (* number 10E4)] 
    (pos? (- n (int n))))) 

Этот подход должен работать:

(defn primefactors 
    ([n] 
    (primefactors n 2 '())) 
    ([n candidate acc] 
    (cond (<= n 1) (reverse acc) 
    (zero? (rem n candidate)) (recur (/ n candidate) candidate (cons candidate acc)) 
    :else (recur n (inc candidate) acc)))) 

функцию primefactors от https://stackoverflow.com/a/9556744

(defn length-of-period [n] 
    (if (integer? n) 
     [0 0] 
     (let [groups (->> n 
         rationalize 
         denominator 
         primefactors 
         (group-by #(zero? (mod 10 %)))) 
      b1 (apply * (get groups true)) 
      b2 (apply * (get groups false))] 
     [(count (take-while 
        #(pos? (mod % b1)) 
        (take 20 (iterate #(bigint (* 10 %)) 1)))) 
     (count (take-while 
        #(pos? (mod % b2)) 
        (take 20 (iterate #(bigint (- (* 10 %) 1)) 1))))]))) 

Результат представляет собой вектор [length-of-preperiod length-of-period] Пример:

(length-of-period 0.123456) => [6 0] 
(length-of-period 1/3) => [0 1] 
;; 1/3 = 0.3333... 
(length-of-period 7/12) => [2 1] 
;; 7/12 = 0.583333.... 

Так что в случае парного вы можете фильтровать ваши номера с #(> 6 (first (length-of-period %)))

0

От: Number of decimal digits in a double

Двойной не всегда является точным представлением. Вы можете только сказать, сколько десятичных знаков у вас было бы, если бы вы преобразовали его в String.

Смежные вопросы