neutr napsal(a)mrmr9 napsal(a)Verze: 5.4.6.2 pro Mac, možná i jiné:
Nevím, kde je chyba, ale procedura níže vrátí výsledek 1730 namísto očekávaných 1731. Pro jiné hodnoty např. 1,732 nebo 1,7311 a pod. funguje korektně a vrací očekávaný výsedek tedy např. 1732 nebo 1731. Zlobí to jen pro hodnotu 1,731, se kterou se provede nějaký výpočet. Samotné int(1731) vrací správný výsledek 1731.
Sub Main
Cislo=1.731
Print(Int(cislo*1000))
End Sub
Obdobný výpočet používám ve funkci na zkrácení čísla na 3 desetinná místa:
vysledek=int(x*1000)/1000 resp univerzální funkce pro zkrácení čísla na určitý počet desetinných míst.
Tuší někdo, proč tak elementární výpočet zlobí u téhle jediné hodnoty (možná jich bude víc, ale zatím jsem na jinou nenarazil).
Jak to napsat, aby se na výpočet dalo spolehnout?
Já mám dojem že chyba je v zápisu toho INT - tato funkce zaokrouhluje. Takže jde spíš o to, jak opravdu vypadají čísla. Otestujte :
Sub Main
Cislo=1.731
Print cislo*1000
End Sub
Je mi jasné že je to pod nějakým složitějším výpočtem a nedá se takto snadno dovodit proč to někdy jde a někdy nikoliv. Ale domnívám se že správné řešení by mohlo být například takto :
Sub Main
Cislo=1.731
Print INT(cislo*10000)/10
'Nebo třeba
Print INT((cislo*10000)/10)
End Sub
Nicméně potvrzuji, že jde o chybu kterou dělá také verze Libre Office: 6.1.0.3
ID sestavení: efb621ed25068d70781dc026f7e9c5187a4decd1
Vlákna CPU: 2; OS: Windows 10.0; Vykreslování UI: výchozí;
Národní prostředí: cs-CZ (cs_CZ); Calc: group threaded
Díky za reakci. Print(Cislo*1000) odzkoušeno, výsledek 1731, tam problém není. Problém je při použití INT (případně i FIX). Zajímavé je, že když je v kódu jen Print(INT(1731)), je to ok a výsledek je korektní 1731. Jakmile se ale udělá int z hodnoty 1731, která vznikne výpočtem, tak je hodnota INT chybná. Přitom výsledky výpočtu jsou ok.
Ten druhý příklad, resp. obě varianty - vynásobit o řád víc a podělit deseti kupodivu funguje pro 1,731 bez chybně. Nevím ale, jestli se na to dá spolehnout pro další čísla :-( Zpracovávám těch hodnot několik tisíc, kde pro některá porovnání potřebuju číslo zaříznout za třetím desetinným místem bez zaokrouhlení.
Zkusil jsem testnout tohle:
Sub Main
For N = 1000 to 2000
X = INT((N/1000)*1000)
Y = FRAC((N/1000)*1000)
If X <> N Then MsgBox("Chyba " & X & " " & N & " " & Y)
Next N
End Sub
Teoreticky by to mělo proběhnout bez zobrazení chyby, ale vyhazuje to chybu na více hodnotách, zpravidla lichých. Tak to asi nebude problém jediného čísla a moc bych se na funkce INT a FIX nespoléhal.
Nevím kam nebo jak se to dělá, ale dá se ten problém někam vyreportovat, aby to časem někdo opravil?