Текущий архив: 2006.07.02;
Скачать: CL | DM;
Вниз
Как "урезать" лишние знаки после запятой у чисел типа real? Найти похожие ветки
← →
Megabyte © (2006-06-14 18:18) [0]Сабж.
Есть функция format, но там параметр типа string. Как-то неохота туда/сюда переформатировать...
← →
unknown © (2006-06-14 18:22) [1]Math.RoundTo
← →
ANB © (2006-06-14 18:36) [2]
> Math.RoundTo
Но будет банковское округление вместо математического.
← →
Megabyte © (2006-06-14 18:39) [3]Эй, мне не округлять надо, а урезать знаки после запятой( до 2-х). Или я неправильно пользуюсь:
RoundTo(o_prih_r + o_prih_r1, 2);
?
o_prih_r + o_prih_r1 - числа типа Real.
← →
Desdechado © (2006-06-14 20:26) [4]> мне не округлять надо, а урезать знаки
тогда что есть "урезать знаки"?
давай пример до и после урезания
← →
Desdechado © (2006-06-14 20:27) [5]и вообще - числа с плавающей точкой имеют весьма интересный способ хранения, который подразумевает погрешность, влекущую за собой мнооооого знаков
← →
unknown © (2006-06-14 21:11) [6]
> ANB © (14.06.06 18:36) [2]
> > Math.RoundTo
> Но будет банковское округление
Можно указать режим округления - в контрольном слове сопроцессора, что,
собственно и делает Math.SetRoundMode
← →
Megabyte © (2006-06-15 10:35) [7]
> Desdechado © (14.06.06 20:27) [5]
> и вообще - числа с плавающей точкой имеют весьма интересный
> способ хранения, который подразумевает погрешность, влекущую
> за собой мнооооого знаков
Во-во.
Вот пример:
дано: 56,24000048
хочу: 56,24
← →
StriderMan © (2006-06-15 10:42) [8]
Result := trunc(Value * 100) / 100;
← →
Ega23 © (2006-06-15 10:53) [9]
> Result := trunc(Value * 100) / 100;
Неправильно.
← →
evvcom © (2006-06-15 11:03) [10]> дано: 56,24000048
> хочу: 56,24
Это тебе кажется. А чтобы не казалось, используй Double или Extended. А с Real от этого не избавишься.
← →
Desdechado © (2006-06-15 11:10) [11]Megabyte © (15.06.06 10:35) [7]
для отображения - Format
для хранения отсечь погрешность не получится, это фича
evvcom © (15.06.06 11:03) [10]
> Double или Extended
это значительно уменьшает погрешность, обычно до недоступных разрядов, но не избавляет от проблемы совсем
способ хранения, имхо, все тот же - мантисса, основание ...
← →
StriderMan © (2006-06-15 11:26) [12]
> Ega23 © (15.06.06 10:53) [9]
> > Result := trunc(Value * 100) / 100;
> Неправильно.
Почему?
56,24000048 * 100 = 5624,000048
trunc(5624,000048) = 5624
5624/100 = 56,24
← →
Megabyte © (2006-06-15 11:28) [13]Короче, мне надо только отображать в Экселе. В самих ячейках числа отображаются нормально, а в строке формул они выводятся с офигенно длинной частью после запятой, кот. не нравится пользователю... м.б. что в экселе делать?
← →
Desdechado © (2006-06-15 11:33) [14]StriderMan © (15.06.06 11:26) [12]
>> Неправильно.
> Почему?
А ты попробуй. А потом почитай-таки теорию по способам хранения чисел с плавающей точкой.
← →
StriderMan © (2006-06-15 11:42) [15]
> Desdechado ©
попробовал. работает.
ShowMessage(FloatToStr(trunc(56.2400000048 * 100) / 100));
теперь попробуй сам.
← →
icWasya © (2006-06-15 12:05) [16]FormatFloat ???
← →
StriderMan © (2006-06-15 12:07) [17]
> FormatFloat ???
возвращает строку
← →
evvcom © (2006-06-15 12:09) [18]> [11] Desdechado © (15.06.06 11:10)
> evvcom © (15.06.06 11:03) [10]
> > Double или Extended
> это значительно уменьшает погрешность, обычно до недоступных
> разрядов, но не избавляет от проблемы совсем
> способ хранения, имхо, все тот же - мантисса, основание...
Я знаю. Потому и написал автору:
> Это тебе кажется. А чтобы не казалось
← →
Zeqfreed © (2006-06-15 12:11) [19]Не могу понять, зачем может понадобиться «отрезание разрядов во внутреннем представлении числа». На то оно и внутреннее, что никто его не видит. Какие бы то ни было преобразования должны делаться только при строковом представлении чисел.
← →
Megabyte © (2006-06-15 12:58) [20]Я же написал уже, мне пофигу, как они хранятся, мне надо это для отображения в экселе.
← →
Zeqfreed © (2006-06-15 13:04) [21]> Я же написал уже, мне пофигу, как они хранятся, мне надо
> это для отображения в экселе.
Для этого в Excel"е есть соответствующие параметры форматирования текста в ячейках.
← →
Megabyte © (2006-06-15 13:20) [22]
> Zeqfreed © (15.06.06 13:04) [21]
Кошмар!!! :) Внимательно читаем!
Да в ячейках все в порядке, траблы с отображением в строко формул вверху, кот. отображает выделенную ячейку!
← →
StriderMan © (2006-06-15 13:24) [23]
> Megabyte
попробуй все-таки мой подход
← →
Megabyte © (2006-06-15 15:09) [24]
> StriderMan © (15.06.06 13:24) [23]
> > Megabyte
>попробуй все-таки мой подход
Ну ничего больше не остается. %)
← →
Loginov Dmitry © (2006-06-15 16:46) [25]evvcom © (15.06.06 11:03) [10]
Это тебе кажется. А чтобы не казалось, используй Double или Extended. А с Real от этого не избавишься.
Интересно, в чем вы видите различия между Real и Double?
← →
Desdechado © (2006-06-15 16:52) [26]> различия между Real и Double?
если мне память не изменяет, раньше Real был тот, который сейчас Real48Type Range Significant digits Size in bytes
Real 5.0 x 10^-324 .. 1.7 x 10^308 15-16 8
Real48 2.9 x 10^-39 .. 1.7 x 10^38 11-12 6
Double 5.0 x 10^-324 .. 1.7 x 10^308 15-16 8
Extended 3.6 x 10^-4951 .. 1.1 x 10^4932 19-20 10
← →
Loginov Dmitry © (2006-06-15 16:55) [27]Да, то было раньше - еще по появления сопроцессоров...
← →
Desdechado © (2006-06-15 17:01) [28]нет, не сопроцессоров, а Win32
← →
SergP. (2006-06-15 17:43) [29]
> Megabyte © (15.06.06 15:09) [24]
>
> > StriderMan © (15.06.06 13:24) [23]
> > > Megabyte
> >попробуй все-таки мой подход
>
> Ну ничего больше не остается. %)
Если нужно без проблем "отсекать" лишние десятичные знаки - используй Currency и не мучайся... Но числа у которых более 4-х дес. знаков там уже не получится хранить...
Страницы: 1 вся ветка
Текущий архив: 2006.07.02;
Скачать: CL | DM;
Память: 0.53 MB
Время: 0.03 c