Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обрезать после запятой (Float)


Страницы:   1 2

Stepan4ik ©   (2014-09-30 08:13:00) 

У меня допустим получается ответ в формате Float 99,999999.
Как мне оставить 2 числа после запятой ? Не округлить ! Ибо если округлить, то получится 100, а просто оставить 2 числа после запятой.


Чукча   (2014-10-03 22:51:00) [1]

то Jeer

> Как мне оставить 2 числа после запятой ? Не округлить ! Ибо если округлить, то получится 100, а просто оставить 2 числа после запятой.
> Я хочу просто выбросить лишние числа.
> По сути я могу перевести Float в String, отбросить лишнее, а потом опять перевсти в Float и уже работать с числом, но это мне кажется муторнее.

==> [19]

А открывать парню глаза на то, что
           19,540
                  +
19,54 / 10 = 1,954
                  +
19,54 / 20 = 0,977
           =
           22,471     !=    22,46

это уже  работа для Вас!


Jeer   (2014-10-03 09:39:00) [2]

>BadTeacher   (02.10.14 23:10) [19]

Чукча, см. желалки в [2] и ответ в [3]


BadTeacher   (2014-10-02 23:10:00) [3]

procedure TForm1.FormCreate(Sender: TObject);
const
 a :Single = -12399.0992345;
var
 p,f :Integer;
 s   :String;
begin
 p := Trunc(Int( a ));
 f := Trunc(Int(Frac(Abs( a ))*100));
 SetLength(s, 1024);
 SetLength(s, wsprintf(PChar( s ),'%i,%#02i', p , f ));
 Caption := s;
end;


Inovet   (2014-10-01 17:21:00) [4]

Но это не вопрос сабжа.


Inovet   (2014-10-01 17:21:00) [5]

Сортируется по убыванию сумм и остаток добавляется/снимается по 1 копейке от больших к меньшим.


VICTOR_   (2014-10-01 16:46:00) [6]


> >для бухгалтерии есть бухгалтерское округление
> Задачу разброса копеек оно не решает

Верно, нужен "расбрасыватель" копеек по правилу :)


VICTOR_   (2014-10-01 16:44:00) [7]


> для бухгалтерии есть бухгалтерское округление
> оно же банковское
> http://www.delphikingdom.com/asp/viewitem.asp?catalogID=1217

Для бухгалтерии есть только арифметическое - 0,5 - округляется всегда вверх.


MBo   (2014-10-01 15:25:00) [8]

>для бухгалтерии есть бухгалтерское округление
Задачу разброса копеек оно не решает


Дмитрий   (2014-10-01 14:30:00) [9]

для бухгалтерии есть бухгалтерское округление
оно же банковское
http://www.delphikingdom.com/asp/viewitem.asp?catalogID=1217


junglecat   (2014-10-01 12:46:00) [10]

россиийская бухгалтерия - она вообще для смекалистых людей )


icWasya   (2014-10-01 12:27:00) [11]

А насчёт копеек...
Ещё во времена DOS писал одну программу для бухгалтерии.
Вкратце так:
Приходят деньги, их надо раскидать по 10-ти счетам в каком-то процентном соотношении. Типа на первый счёт - 40%, на второй 15%, на третий -3.5% нп четвёртый 15% от второго и т.д.

В итоге печатается таблица, в первой колонке - пришедшие деньги, в последующих - на какой счёт сколько пришло.
А в последней строке -ИТОГО.
А бухгалтеры компьютерам не верят, и всё перепроверяют на калькуляторах.
И требуется, что бы во первых, процент, взятый от поступивших денег, совпадал с вычисленным на компьютере, а во вторых, сумма строки совпадала с первой колонкой. И если с первым более менее понятно, то со вторым...
Скажем взять три с половиной процента от некруглого числа, и придётся округлять. В ту или другую сторону. И в итоге сумма отличается от исходной на 1-2 рубля. Приходилось применять смекалку ;)


Dennis I. Komarov   (2014-09-30 10:55:00) [12]

А тебе говорили, разберись с вещественными числами. А потом уже пиши программы...


Stepan4ik   (2014-09-30 10:49:00) [13]

Сделал так :

var
I:Extended;
a:Currency;
begin
I:=StrToCurr(Edit1.Text);
I:=(I*100)/115;
a:=FloatToCurr(i);
Edit1.Text:=CurrToStr(a);
end;

Выходит 19,5304. Копейка теряется... Жаль.
Или же я не так понял функцию...


MBo   (2014-09-30 10:07:00) [14]

Итого*100/115
Однако результат из-за последовательных округлообрезаний с потерей данных будет несколько отличаться.
Ещё раз напомню про Currency.


Stepan4ik   (2014-09-30 09:49:00) [15]

Я запутался блин.

Промежуточный итог: 19,54

Counter-Strike: Global Offensive комиссия (10.0%): 1,95
Комиссия Steam за операцию (5.0%): 0,97

Итого: 22,46

У меня есть только "Итого" 22,46.
Как мне с него получить "Промежуточный итог" ?
Пробовал (Итого / 115 ) * 15. Но все равно выходит не то...


Dennis I. Komarov   (2014-09-30 09:46:00) [16]

Каждый должен найти свои грабли сам))) до этого просветление не настанет


MBo   (2014-09-30 08:51:00) [17]

>Ибо от ответа зависит дальнейшая работа программы)
Можешь нарваться на ситуацию вроде
99.99+0.01 <> 100.00

И в Pos использовать жестко запятую вместо DecimalSeparator - тоже аукнется.


Stepan4ik   (2014-09-30 08:39:00) [18]

Спасибо за помощь, но я лучше наверное сбыдляню )
Ибо от ответа зависит дальнейшая работа программы)

var
A,B:string;
I:Extended;
begin
I:= StrToFloat(Edit1.Text)/115;
A:=Copy(FloatToStr(I),1,Pos(',',FloatToStr(I))-1);
B:=Copy(FloatToStr(I),Pos(',',FloatToStr(I))+1,Length(FloatToStr(I)));
Delete(b,3,100);
Edit1.Text:=A+','+B;
end;

Это вроде бы работает в полне нормально )


MBo   (2014-09-30 08:34:00) [19]

См. второй абзац. Числа типа Single или Double со значением 99.99 не существует, точное значение будет немного отличаться, например, 99.989973

http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=374
http://habrahabr.ru/post/112953/
http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html


Stepan4ik   (2014-09-30 08:26:00) [20]

Я хочу просто выбросить лишние числа.
По сути я могу перевести Float в String, отбросить лишнее, а потом опять перевсти в Float и уже работать с числом, но это мне кажется муторнее.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо