Премини към съдържанието

Препоръчан отговор


Здравейте,

 

Може ли някой да ми обясни защо гадната функция RoundTo() в Delphi закръкля числата по неразбираем начин:

0.115= 0.12

0.215=0.21

0.315=0.31

0.415=0.41

0.515=0.52

0.615=0.61

0.715=0.71

0.815=0.81

  0.915=0.92

 

Това безумно закръгляне ми отрови живота последните дни..:(:(:(

Има разни подобрения на RoundTo() от рода на SetRound... , които не променят това закръгляне - или всичко пада надолу или се качва нагоре .... :(:(

 

Ако е възможно и някой знае как Моля да сподели как да го накарам това Delphi всеки път да закръгля от 5 включително нагоре, а под 5 надолу.

Предварително Благодаря!

 

 

 

 

 

 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Здравейте,

 

Може ли някой да ми обясни защо гадната функция RoundTo() в Delphi закръкля числата по неразбираем начин:

0.115= 0.12

0.215=0.21

0.315=0.31

0.415=0.41

0.515=0.52

0.615=0.61

0.715=0.71

0.815=0.81

  0.915=0.92

 

Това безумно закръгляне ми отрови живота последните дни.. :(:( :(

Има разни подобрения на RoundTo() от рода на SetRound... , които не променят това закръгляне - или всичко пада надолу или се качва нагоре .... :(:(

 

Ако е възможно и някой знае как Моля да сподели как да го накарам това Delphi всеки път да закръгля от 5 включително нагоре, а под 5 надолу.

Предварително Благодаря!

x=int(x*100+.5)/100

  • Харесва ми 2

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Може ли някой да ми обясни защо гадната функция RoundTo() в Delphi закръкля числата по неразбираем начин:

Компютрите представят всички числа, включително и дробните в двоичен вид. Това не е проблем за целите числа, които се представят точно. Обаче с дробните числа не е така, и се получава грешка.

Ако е възможно и някой знае как Моля да сподели как да го накарам това Delphi всеки път да закръгля от 5 включително нагоре, а под 5 надолу.Предварително Благодаря!

Ами направи си функция, която да закръгля за конкретния случай. Ще е по-бавна, но ще работи.
  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

x=int(x*100+.5)/100

Това е мъдро! Благодаря!

Очаквах обаче да има нещо като задаване на глобален параметър, който да се установява за цялата програма, защото сега това трябва да го сложа на един милион места .....направо не ми се мисли .....

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Това е мъдро! Благодаря!

Очаквах обаче да има нещо като задаване на глобален параметър, който да се установява за цялата програма, защото сега това трябва да го сложа на един милион места .....направо не ми се мисли .....

създавате си нова функция, която да прави това. И с просто заменяне на стринг в програмата заменяте старата функция с новата :)

А не мисля че с глобален параметър може да стане, защото това е просто характеристика как се представят вътрешно дробните числа както ви обясни (много по-подробно) колегата по-горе

П.П. Само внимавайте какви стрингове замествате да не заместите нещо, което не трябва :)


Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Ако ползваш променливи с единична точност е възможно да има такива отклонения независимо как го изчисляваш закръглянето. 

A simple comparison [x:=6.45]:"writeln(x:10:1);"CPU:x86, OS:Win32Delphi 5 output: single: 6.4 double: 6.5 extended: 6.5 currency: 6.5Delphi XE output: single: 6.4 double: 6.5 extended: 6.5 currency: 6.5

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.