SayIT

Software => Programare => Topic started by: kman on 02 November 2006, 16:38

Title: WTF: implementare de round
Post by: kman on 02 November 2006, 16:38
Pentru ca nu avem (inca ?) sectiune de WTF, postez aici ultima mea creatie pe ziua de azi.

... deci, datele problemei, limbaj de programare proprietar (50% asemanator cu TCL), suport inexistent pentru numere rationare/reale/negative, functii matematice inexistente.
Se cere, pentru un sistem care nu suporta decat fix 2 zecimale dupa virgula sa se implemnteze o functie de round care sa impace si capra si varza.

Demonstratie ....  :fk: .... si dupa 9 luni (minute de gandire) aparu' monstru:
Code (php) Select
proc round { pm_val pm_prec } {
        local lv_point_pos [strfindsub $pm_val "."]
        if { [null $lv_point_pos] } {
                # if number is integer return number
                return $pm_val
        }
        local lv_supra [strsub $pm_val 0 $lv_point_pos]
        local lv_subu [strsub $pm_val [expr $lv_point_pos + 1] $pm_prec]
        local lv_nextn [strsub $pm_val [expr $lv_point_pos + 1 + $pm_prec] 1]
        if { [null $lv_nextn] } {
                # if no values after rounding position return initial number
                return $pm_val
        }
        if { $lv_nextn >= 5 } {
                # do we need rounding ?
                local lv_subu [expr $lv_subu + 1]
                if { [strlen $lv_subu] > $pm_prec } {
                        local lv_subu [strsub $lv_subu 1 $pm_prec]
                        local lv_supra [expr $lv_supra + 1]
                }
        }
        # reconstruct the number
        local lv_nr [strcat $lv_supra "." $lv_subu]
        return $lv_nr
}


Q.E.D.  :fum: