Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2016.04.24;
Скачать: CL | DM;

Вниз

Обрезать после запятой (Float)   Найти похожие ветки 

 
Stepan4ik   (2014-09-30 08:13) [0]

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


 
MBo ©   (2014-09-30 08:23) [1]

Если речь идёт о том, чтобы сформировать строку, представляющую вещественное число с двумя знаками после запятой, то для этого есть функции Format, FormatFloat и т. п.
s := Format("%8.2f", [x]);

Если вдруг хочется получить вещественное число c точным значением 99.99, то это невозможно ввиду внутреннего представления вещественных чисел
(для некоторых задач может пригодиться тип Currency)


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

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


 
MBo ©   (2014-09-30 08:34) [3]

См. второй абзац. Числа типа 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:39) [4]

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

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:51) [5]

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

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


 
Dennis I. Komarov ©   (2014-09-30 09:46) [6]

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


 
Stepan4ik   (2014-09-30 09:49) [7]

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

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

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

Итого: 22,46

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


 
MBo ©   (2014-09-30 10:07) [8]

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


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

Сделал так :

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

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


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

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


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

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

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


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

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


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

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


 
MBo ©   (2014-10-01 15:25) [14]

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


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


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

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


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


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

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


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

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


 
Inovet ©   (2014-10-01 17:21) [18]

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


 
BadTeacher   (2014-10-02 23:10) [19]

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;


 
Jeer ©   (2014-10-03 09:39) [20]

>BadTeacher   (02.10.14 23:10) [19]

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


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

то Jeer

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

==> [19]

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

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



Страницы: 1 вся ветка

Текущий архив: 2016.04.24;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.006 c
15-1438863349
Кто б сомневался
2015-08-06 15:15
2016.04.24
Win10 EULA - новые проблемы от новой ОСи


15-1439457626
NailMan
2015-08-13 12:20
2016.04.24
Помогите с написанием функции для ардуинки


2-1411564536
Who_are_you?
2014-09-24 17:15
2016.04.24
делфи 7 а делфи 5


15-1439447496
K-1000
2015-08-13 09:31
2016.04.24
Неверно работает RandomRange()


2-1412352887
Желание
2014-10-03 20:14
2016.04.24
Имя метода procedure of object