Zaokruhlovanie   zodpovězená otázka

VB.NET

Ahoj chcel by som sa spytat ako zaokruhlim cilslo tak aby jeho posledne dve hodnoty boli cele...

Napr. 6366,197723 na 6370 toto zaokruhlenie robim v textboxe tazke pouzivam funkciu Format.

toto je zaokruhlenie na cele cislo ale ako zaokruhlit posledne dve cisla mojho vysledku na cele ?

tb_otackyFrezovanie.Text = Format((otacky), "0")

Dakujem

dodo

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mozno hlupost ale funguje to... :-)

tb_otackyFrezovanie.Text= ((CInt(otacky \ 10) + 1) * 10)

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Dakujem Martin toto mi pomohlo robi to presne to co ma...

Skusal som aj to p.Hübelbauera ale to mi robi presne to co mi robilo doteraz... zaokruhluje iba po cele cislo neviem ako mam zapisat aby zaokruhlilo posledne dve cisla na cele...

Dakujem

dodo

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Omlouvám se, nepochopil jsem přesně co chcete, až teď, když prohlížím kód p. Nitrama. To, co jsem psal já zaokrouhlí na 2 desetinná místa. To, co potřebujete Vy, ošetří Viktorův kód.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pro Martina:

Je to sice jednoduché, ale principiálně použitelné. Jenom pozor, místo CInt je tam potřeba použít round a odstranit tu přičítanou jedničku - jinak Vám to bude blbě zaokrouhlovat (zkuste si, čísla od xxx49,5 do xxx59,4999 Vám zaokrouhlí jako xxx60)

nahlásit spamnahlásit spam 0 odpovědětodpovědět
Math.Round(cislo, 2)
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vážený kolego,

bohužel z Vašeho popisu si nejsem opět zcela jist, zdali chápu Vaše želanie, proto jsem zkusil postihnout všechny možnosti.

Nejprve tedy, jaké možnosti mne napadly:

1) Potřebujete zaokrouhlovat na konkrétní řád čísla, tedy ve Vašem případě třeba na stovky (pokud tedy si vyložím požadavek, že chcete mít "poslední dvě čísta výsledku celé" tak, že chcete, aby na těchto posledních dvou místech byly nuly.

Bohužel to, co napsal Tomáš Vám asi dostačovat nebude, protože na rozdíl od např. excelu, kde tato funkce dokáže zaokrouhlovat i na pozice vlevo od desetinné čárky (při druhém parametru záporném), VisualBasic to umí jenom doprava - vyžaduje kladné číslo.

2) Nebo chcete zaokrouhlovat na konkrétní počet platných číslic. Jak jsem z textu pochopil, jde Vám o reálnou situaci s konkrétní "fyzikální" podstatou. No a tady se spíše využije zaokrouhlení na počet platných číslic (pokud na tu svou frézku hodíte místo plátkové korunky nějaký velký vrták, budete potřebovat výrazně nižší otáčky a při otáčkách kolem 100-vky by Vám asi už zaokrouhlení na "poslední 2 místa nulová" nevyhovovalo).

Takže ať jste měl na mysli kteroukoliv variantu, zkuste

něco takového (vypadá to velké, ale když vyhážete ty komentáře, tak je to jen pár řádků kódu):

''' <summary>
    ''' Funkce zaokrouhluje vstupní číslo na požadovaný řád, resp. požadovaný
    ''' počet platných číslic
    ''' </summary>
    ''' <param name="cislo">číslo (double), které chceme zaokrouhlit.</param>
    ''' <param name="rad">V případě, že proměnná "platne" není zadána, nebo je její hodnota False
    ''' udává řád, na který chceme číslo zaokrouhlit (kladná čísla udávají počet desetinných míst,
    ''' záporná počet nul nalevo od desetinné čárky.
    ''' V případě, že je proměnná platne=true, udává požadovaný počet platných číslic</param>
    ''' <param name="platne">Přepínač typu zaokrouhlení: False, nebo nezadáno - zaokrouhluje se na řád čísla,
    ''' True - zaokrouhluje se na počet platných číslic</param>
    ''' <returns>Formátovaný řetězec (string) v požadovaném zaokrouhlení</returns>
    ''' <remarks></remarks>
    Private Function zaokrouhli(ByVal cislo As Double, ByVal rad As Integer, Optional ByVal platne As Boolean = False) As String

        ' hodnota, která se bude vracet v případě, že nebude prováděn výpočet
        zaokrouhli = "0"

        ' pomocná proměnná pro ošetření manipulace se zápornými čísly
        Dim znamenko As Integer = 1

        ' pokud je číslo=0, vrátíme defaultní řetězec "0"
        If cislo = 0 Then Return zaokrouhli

        ' pokud je číslo < 0, převedeme je na kladné a do pomocné proměnné si poznačíme,
        ' že je zapotřebí znaménko opět vrátit na záporné (obejdeme tím problémy s log(záporného čísla)
        If cislo < 0 Then
            cislo *= -1
            znamenko = -1
        End If

        ' pokud je požadováno zaokrouhlení na počet platných číslic
        If platne Then

            ' zkontrolujeme, není-li zadán nesmyslný počet platných číslic
            If rad < 1 Then Return zaokrouhli

            ' zjistíme řád čísla (pozici první platné číslice zleva) a přepočítáme proměnnou rad
            ' tak, abychom převedli výpočet na zaokrouhlování dle řádu
            rad = rad - Math.Floor(Math.Log10(cislo)) - 1

        End If

        ' provedeme vlastní zaokrouhlení (na výsledek aplikujeme pomocnou proměnnou znaménko, čímž změníme
        ' číslo opět na záporné, pokud jsme tak učinili na začátku)
        Return Format(znamenko * Math.Round(cislo * Math.Pow(10, rad)) / Math.Pow(10, rad), "#,##0.###")
    End Function

Samozřejmě je to možno výrazně zjednodušit (pokud si přejete jen jeden ze způsobů zaokrouhlování, ale s tím si jistě již poradíte sám.

A použití je stejně jednoduché, pokud chcete zaokrouhlit na stovky (tzn. aby byly první 2 číslice vlevo od desetinné čárky rovny 0), pak jednoduše napiště:

tb_otackyFrezovanie.text=zaokrouhli(otacky,-2)

a pokud chcete zaokrouhlovat třeba na 3 platné číslice, tedy

12356,58 -> 12 400

123,5658 -> 124

1,235658 -> 1,24

atd., pak jednoduše napište

tb_otackyFrezovanie.text=zaokrouhli(otacky,3,true)

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

V prvom rade dakujem za vycerpavajucu odpoved. Mate pravdu ze ked pouzijem mensiu reznu rychlost a vacsi priemer vrtaku tak hodnota sa zaokruhluje nie dobre.

Vyskusal som aj vas kod ale tiez to neni ono... Skusim este raz co potrebujem :

tazke mam vzorec:

otacky = (tb_VcFrezovanie.Text * 1000) / (3.14 * tb_primerOtacky.Text)

teda

otacky = (2 * 1000) / (3.14 * 40)

tak by mal vynst vysledok 15,91549430 ked to zaokruhlim na cele cislo tak vysledok je 16 a ked ten vysledok 16 zaokruhlim na cele cislo tak hodnota je 20 a presne toto potrebujem.

Dufam ze uz som to napisal zrozumitelne..

Dakujem

dodo

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Já Vás zdravím, přiznám se, že jsem to ani tentokrát přesně nepochopil:

Pokud číslo 15,91549... zaokrouhlím "na celé číslo", dostanu 16, s tím nelze než souhlasit.

Pokud ale 16 zaokrouhlím na celé číslo, dostanu opět 16, protože 16 je celé číslo.

Teď to berte spíše jako filosofickou debatu, pokud jste již nalezl řešení svého problému, je to dobře. Ale spíše byste se mohl trošičku zamyslet nad tím, že v mnohých případech je prvotním úspěchem programu správná a srozumitelná definice problému.

Takže (jestli Vás tím moc nezdržuji):

Máte výsledek 15,91549 a chcete obdržet výsledek 20.

Co když bude Váš výsledek 159,149 - chcete získat jako výsledek

200, nebo 160 ?

V tom prvém případě (výsledek 200) zaokrouhlujete na 1 platné místo (ne, že bych Vám vnucoval svůj kód, ten byl spíše ilustrativní a můžete / nebo nemusíte si z něj vyseparovat to, co se Vám hodí), proto adekvátního výsledku dosáhnete voláním funkce zaokrouhli(číslo,1,true).

V tom druhém případě (výsledek 160) pak zaokrouhlujete na řád, v tomto případě na desítky a opět za použití výše uvedené funkce stačí napsat její volání ve tvaru zaokrouhli(číslo,-1).

Předpokládám totiž, že Váš požadavek bude v rámci programu konsistentní, tedy budete mít stejné pravidlo pro zaokrouhlování otáček, i když Vám vyjde při výpočtu 1,5915 - 15,91543 - 159,1543 nebo 1591,543.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tazke zase dakujem za odpoved naozaj si to cenim neni vela takych co pomozu s problemom. Som zaciatocnik tazke kym to pochopim tak to troska dlhsie trva... a urcite ma nezdrzujete velmi rad sa priucim.

K vasej otazke:

Takže (jestli Vás tím moc nezdržuji):

Máte výsledek 15,91549 a chcete obdržet výsledek 20.

Co když bude Váš výsledek 159,149 - chcete získat jako výsledek

200, nebo 160 ?

Chcem cislo 160

Mam v mojej kalkulacke radioButtony ktore si mozem prepnut prvy rb mam nastaveny na 6 desatinnych (0.000000) miest druhy mam nastaveny na cele cislo (0.) a treti chcem aby zaokruhloval posledne dve cisla pred desatinou ciarkou na cele cislo tak ako pisete hore.

Skusam sa este bavit s vasim kodom a najlepsi efekt mam ked mam nastavene zaokruhlovanie na 2 ale iba vtedy ked cislo vyjde trojciferne ked vyjde stvorciferne tak uz to neurobi tak ako by som chcel...

Preto by som mal asi dat do programu nejaku podmienku IF ktora bude sledovat ake cislo vyslo v textboxe a podla toho rozhodne kolko miest pred ciarkou bude zaokruhlovat...

Dufam ze som to uz napisal viac zrozumitelne...

Dakujem

dodo

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mozno zase hlupost ale pracuje to dobre a presne ak som vas dobre pochopil.Tiez som len nedavno zacal programovat.

A je tu jedno ake je to cislo ci je to cislo 3,4,5,6 i viac ciselne.Zaokruhly to co treba.

tb_otackyFrezovanie.Text =FnOtacky(otacky)

Function FnOtacky(ByVal A As Integer) As Double
Dim B As Double
B = A / 10
A = B
B = A * 10
Return B
End Function

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nerad Vám kazím radost (ale co už ode mne můžete očekávat :-), ale zase to není to pravé ořechové.

Zkuste si zadat třeba číslo 1234,56.

Pokud jej chcete zaokrouhlit na desítky, dle všech pravidel zaokrouhlování byste měl obdržet číslo 1230 (neb další platné místo obsahuje číslici 4, která se zaokrouhluje směrem dolů).

Ale Vašim kódem dostaneme 1240. Proč?.

Je to celkem jednoduché:

Vstoupíte do funkce s číslem 1234,56, u kterého však hned v prvním kroku (přiřazení do proměnné A) provedete první zaokrouhlení, neb A máte deklarováno jako Integer.

Takže do funkce se Vám již dostane zaokrouhlená hodnota

1234,56 -> 1235.

Ve druhém kroku jenom tuto hodnotu vydělíte 10, což se nic nestane, pouze desetinná čárka se posune o jedno místo vlevo.

No a pak opět (přiřazením do celočíselné proměnné) provádíte v pořadí již druhé zaokrouhlování, takže dostanete výsledek

123,5 -> 124

Pak už jenom vrátíte řád na původní místo a obdržíte chybnou hodnotu 1240.

Pokud chcete obdržet hodnotu správnou, musíte provést zaokrouhlování pouze 1x!

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No a zkoušel jste zadat

zaokrouhli(číslo,-1)

?

Já skutečně dle posledních informací myslel, že chcete obdržet výsledky:

12,3546 -> 10

123,456 -> 120

1234,56 -> 1 230

12345,6 -> 12 350

atd. (toto právě dělá ten uvedený příklad).

Jinak Martin se k tomu řešení taky již pomalu blíží, takže si myslím, že v příštím kole by již mohl sestavit správný kód

(bude de facto stejný, jako ten můj. Bude, samozřejmě, podstatně jednodušší, protože bude řešit přesně a jen jeden z případů (jeden způsob zaokrouhlování na desítky), kdežto te můj byl pojat univerzálně. Pokud víte, že nikde ve své aplikaci nebudete potřebovat zaokrouhlovat jinak, než na desítky, je zbytečné se tím komplexním kódem zaobírat, pokud však uvažujete, že byste mohl časem chtít mít k dispozici zaokrouhlování i na jiné řády, nebo dokonce budete chtít uživateli dát možnost, aby si "přesnost výstupů" zvolil či nastavil sám, pak se něčemu takto komplexnějšímu asi nevyhnete.

Pokud Vám ale mohu poradit, tentokrát ne jako programátorovi, ale spíše jako strojař strojaři, pak bych systém zaokrouhlování ještě jednou zvážil. Pokud máte délkové míry (pojezdy apod.), tam samozřejmě budete zaokrouhlovat dle rozličení pojezdového měřítka (pokud máte dělení na 0,05 mm, nemá valného smyslu mít výstupy v řádu desetitisícin).

Pokud však máte rychlostní veličiny, velokost síly, hmotnosti a pod. tam jde většinou o procentuální přesnost měření (třeba u té rychlosti - většina mašin je poháněna asynchronními motory, u kterých se pohybuje rozptyl skluzu v rozmězí několika %), tak tam je ve zvyku zaokrouhlovat spíše na platná čísla.

Pokud tedy zopakuji tu výše udanou řadu, tak jsou pro mne spíše zajímavé výstupy:

1,2345 -> 1,23 (při zaokrouhlení na desítky výsledek 0)

12,345 -> 12,3 (při zaokrouhlení na desítky výsledek 10)

123,45 -> 123 (při zaokrouhlení na desítky výsledek 120)

1234,5 -> 1230 (při zaokrouhlení na desítky výsledek 1230)

12345 -> 12300 (při zaokrouhlení na desítky výsledek 12340)

atd.

(ale to už bylo jen tak mimo soutěž)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Presna ako pisete na zaciatku tie priklady tak tak to chcem zaokruhlovat! Asi som to nenapisal moc jasne :)

Ale po zmeneni kodu na:

zaokrouhli(číslo,-1)

to uz funguje spravne ja som tam pouzil:

tb_otackyFrezovanie.text=zaokrouhli(otacky,3,true)

a to mi nefungovalo tak ako som chcel po zmene kodu je to uz OK.

Samozrejme pouzivam v mojom programe viac zaokruhlovani ale nepouzivam ich na vypocet ale iba na zobrazenie vypocitaneho vysledku ktoremu dam format podla zvolenych zaokruhleni.

Myslim ze to je v poriadku a funguje to tak ako ma....

Vypocty drah v mojom Editore nerobim kedze vypocet spravy samotny CAM system ja potrebujem kod len upravit popripade doplnit nejake cykly...

Dkaujem

dodo

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback