![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать количество знаков после запятой?
arhis © (2006-09-21 16:57:00)узнаю так:
met:=2;
PrBuf:=(Deal.Price-Int(Deal.Price))*10;
While true do
begin
PrBuf:=PrBuf*10;
if (PrBuf-Int(PrBuf))=0 then break;
inc(met);
end;
работает кроме случая 100.023
В этом случае релультат вычитания аномален.
Может это вообще можно както прощще сделать?
arhis (2006-09-21 18:54:00) [21]Ketmar © (21.09.06 18:37) [21]
Вы, сударь попытались бы лучше объяснить в чем проблема а не упражнятся в намеках. Насколько я понимаю ветка называется начинающим? Я по адресу попал?
arhis (2006-09-21 18:52:00) [22]han_malign © (21.09.06 18:30) [20]
я не совсем понимаю причем тут погрешности?
Я беру число 0,023 и умножаю его на 100, и всегда получаю 2,3 хоть тресни. потом умножаю еще на десять и получаю 23. Потом просто вычитаю из 23 23 и не получаю нуля?
Где моя логика неправа?
Ketmar (2006-09-21 18:37:00) [23]>[20] han_malign(c) 06-09-21 18:30
аффтару на это уже намекали. %-)
han_malign (2006-09-21 18:30:00) [24]
> Тайна сия велиуа есть.
- угу, тебе число Пи до какого знака выводить?
Ты вообще понимаешь, что каждый раз когда умножаешь на 10 - увеличиваешь в 10 раз погрешность?
У extended 19-20 - значимых цифр, умножив на 100 - 100.023 ты и получаешь погрешность в (19-5)-знаке(2,842*10-14), и дальше эта погрешность может увеличиваться... Другое дело, что, в зависимости от конкретного значения, погрешность умножения на 10 может быть и нулевой - но это скорее исключение.
arhis (2006-09-21 17:56:00) [25]Тайна сия велиуа есть.
0.0012 работает
0.0011 не работает
Ketmar (2006-09-21 17:19:00) [26]>[17] arhis 06-09-21 17:18
>тому же повторюсь уж слишком смущает столь
>экстравагантный результат простейшей
>математической операции.
"это дубли у нас простые" (ц)
arhis (2006-09-21 17:18:00) [27]Ketmar © (21.09.06 17:09) [13]
Да, моя религия мне не позволяет чисто математическую задачу решать чернез строки. К тому же повторюсь уж слишком смущает столь экстравагантный результат простейшей математической операции.
arhis (2006-09-21 17:13:00) [28]2,842*10-14 это не ноль
arhis (2006-09-21 17:12:00) [29]Наиль © (21.09.06 17:08) [12]
Пробовал не определяет как ноль
Наиль (2006-09-21 17:09:00) [30]В [12] опечатку сам исправишь
Ketmar (2006-09-21 17:09:00) [31]>[7] arhis 06-09-21 17:05
>или экспонента или сам указывай число знаков а
>мне и нужно узнать их количество
указать побольше, лишние нули обрезать -- религия запрещает?
Наиль (2006-09-21 17:08:00) [32]
> if (PrBuf-Int(PrBuf))=0 then break;
Uses Math
if IsZero(PrBuf) then break;
arhis (2006-09-21 17:07:00) [33]XTD © (21.09.06 17:06) [8]
Вы алгоритм смотрели? там как раз и умножается а потом вычитается челое, но потом происходит глюк с арифметической операцией, вот я и спрашиваю что я делаю не так. Frac мне вообще от 234 возвращает 1
palva (2006-09-21 17:06:00) [34]Если число представлено с погрешностью, то количество знаков узнать невозможно. Ну а если число представлено точно, то перевести в десятичную систему и посчитать нули.
arhis (2006-09-21 17:06:00) [35]К тому же после таких арифметических вывертов становиться как то очень не спокойно на душе.
XTD (2006-09-21 17:06:00) [36](5) Умнож на 100
arhis (2006-09-21 17:05:00) [37]или экспонента или сам указывай число знаков а мне и нужно узнать их количество
Ketmar (2006-09-21 17:05:00) [38]конвертируй в строку, работай со строкой.
arhis (2006-09-21 17:05:00) [39]Int к дроби?
XTD (2006-09-21 17:02:00) [40]Отними от твоего числа целое, останется после запятой Length(IntToStr(S))