![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обрезать после запятой (Float)
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 и уже работать с числом, но это мне кажется муторнее.