Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2016.04.24;
Скачать: [xml.tar.bz2];

Вниз

Обрезать после запятой (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.002 c
4-1276949542
lexi
2010-06-19 16:12
2016.04.24
Проверить существование родительского процесса


2-1411245669
Stepan4ik
2014-09-21 00:41
2016.04.24
Function 2 значения


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


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


15-1439587804
Юрий
2015-08-15 00:30
2016.04.24
С днем рождения ! 15 августа 2015 суббота





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский