Форум » Clipper » Странный round() » Ответить

Странный round()

aleksei: 5.2е. Программа из одной строчки: ? round(2200.845, 2) у меня выдает: 2200.84 Не сочтите за глупую просьбу - проверьте кто-нибудь.

Ответов - 22, стр: 1 2 All

Григорьев Владимир: Это означает, что 2200.845 представлено в памяти как 2200.844ххх и т.д.

Dima: Не помню где брал ;) Function P_Round(Number,Decimals) static Const := 0.0000000000000002220446049250313 Decimals:=if(Decimals==NIL,2,Decimals) return round((mantissa(Number)+if(Number>0,1,-1)*Const)*2^exponent(Number),Decimals)

aleksei: Ох спасибо. С копейками на клиппере надо быть осторожней.


i3t4j6: function myROUND(NEO) local oen oen=round(neo,4) return(round(1000*Oen,-1)/1000)

Pager: Вот еще ошибочки round(1.275, 2), str(1.275, 4,2), tran(1.275, "9.99") round(8.235, 2), str(8.235, 4,2), tran(8.235, "9.99") и еще один вариант roundA //Функция типа round вместо встроенной. Идея взята из конференции. //Идея основана на прибавлении несущественной величины перед округлением //(Кстати, когда nPos < 0, то round не врет) func ZRound (nNumber, nPos) local nPosExp := 10^nPos, nRet nRet := int(abs(nNumber)*nPosExp + 0.500001) / nPosExp if nNumber < 0 nRet := -nRet endif return nRet

Владимир: aleksei Это точно. Та еще засада могет быть

suv7: Pager пишет: func ZRound (nNumber, nPos) local nPosExp := 10^nPos, nRet nRet := int(abs(nNumber)*nPosExp + 0.500001) / nPosExp if nNumber < 0 nRet := -nRet endif return nRet ?zround(1.0499999003,8) => 1.0499999 ну надо же в восьмом знаке видит ноль ?zround(1.0499999003,1) => 1.1 а тут во второй не может заглянуть Все эти поделки ничего не стОят Есть только одна хорошая функция - моя RoundTo Она кстати и в четную умеет округлять и на заданную точность настраиваться.

Dima: suv7 пишет: Есть только одна хорошая функция - моя RoundTo Ни кто и не сомлевалси ;) Выкладуй исходник ;)

suv7: ну типа вот http://slil.ru/24618436

suv7: дим, я тебя просил мои ники покилять

suv7: Round5DefaultMode([.T. | .F.]) - Установка, как будет округляться 5 - вверх (.T.) или к четному (.F.) Возвращает предыдущую установку FloatDigits(Num) - установка ОБЩЕГО количества десятичных позиций (как в целой, так и в дробной части), которым "можно верить" По умолчанию - 12. Это значит, что верим 12 дробным знакам в числе 0.123456789012хххххххх и четырём дробным знакам в числе типа 11222333.1234хххх Имеет смысл устанавливать от 12 до 15-16 знаков. RoundTo(N,Dec,[Round5toUp]) - параметры как в ROUND, 3й параметр - явное указание, куда округлять 5. Если не указано - используется значение, возвращаемое функцией Round5DefaultMode

Dima: suv7 пишет: дим, я тебя просил мои ники покилять Убить всех SUV с цифирками и оставить только suv7 ?

Dima: suv7 пишет: ну типа вот Спасибо !!!

suv7: убить всех suv* кроме suv2, пароль 123456

Dima: suv7 пишет: убить всех suv* кроме suv2 Сделал. PS Не могу удалить просто suv , видать Dimma обделил меня с правами ;)

suv2: тест suv2 с каким-то коротким паролем, но не с 123456

suv2: а это suv2 с паролем 123456

suv2: а это suv2 с паролем suv2

suv2: дим с форумом полная фигня.

Dima: suv2 пишет: дим с форумом полная фигня. проверил , все номано , у меня по крайней мере;) suv2 пишет: а это suv2 с паролем suv2 так вообще не пустит (меня не пустило)



полная версия страницы