powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Округление дробной части числа до двух зеаков
15 сообщений из 15, страница 1 из 1
Округление дробной части числа до двух зеаков
    #32122428
vislex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Подскажите пожалуйста как округлить дробную часть числа до двух знаков, например вычисляется число: 36.729 а надо его округлить до 36.73.
Под конец дня вообще ниче в голову не лезет :)
Спасибо

С Уважением, Алексей
...
Рейтинг: 0 / 0
Округление дробной части числа до двух зеаков
    #32122430
Starodub Igor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Умнож на 100, отбрось дробную часть, раздели на 100.
2. Переконверть в строку, обреж
...
Рейтинг: 0 / 0
Округление дробной части числа до двух зеаков
    #32122446
NightSpider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-во. Я долго парился с типом money, у него реальное число знаков после запятой гораздо больше, чем отображается и во всех арифметических операциях используется полное число. Такие смешеые вещи иногда получались, типа 2,50+2,50=5,01
...
Рейтинг: 0 / 0
Округление дробной части числа до двух зеаков
    #32122451
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет. Используй RoundTo(43.4524,-2) и подобные функции
...
Рейтинг: 0 / 0
Округление дробной части числа до двух зеаков
    #32122452
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет. Используй RoundTo(43.4524,-2) и подобные функции
...
Рейтинг: 0 / 0
Округление дробной части числа до двух зеаков
    #32122458
Seryoga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Ну, если отбрасывать дробную часть - это округлением не назовешь...
2. Западэнцы используют статистическое округление (при округлении пятерки направление зависит от четности предыдущего знака, например round(1.5) = round(2.5) = 2) и тип currency, абсолютно бесполезные для нас, использующих округление математическое и 2 знака после запятой. Так что если дело касается бухгалтерии и статичтическое округление не устраивает, лучше всего написать собственную функцию.
В меня могут опять по этому поводу плюнуть и бросить кирпич, сказав что бухгалтер может списать ошибки округления в непредвиденные расходы и т.п., но только своя функция будет давать корректный результат.
...
Рейтинг: 0 / 0
Округление дробной части числа до двух зеаков
    #32122467
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Math.pas есть столько готовых чудных функций, что ничего писати не надо. Там и банковское округление, и математическое и другое. Буржуи позаботились о любителях математики. Посмотрите функции, схожие с RoundTo
...
Рейтинг: 0 / 0
Округление дробной части числа до двух зеаков
    #32122472
Seryoga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а я не нашел :((
раундту и сетраундмод знаю, но по поводу пятерки как правило изменить - я тады пас.
...
Рейтинг: 0 / 0
Округление дробной части числа до двух зеаков
    #32123056
Фотография Shark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Seryoga
Оператор + знаешь?
Y:=Round(X+Чего тебе там надо)
...
Рейтинг: 0 / 0
Округление дробной части числа до двух зеаков
    #32123459
Фотография Teo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, может это поможет?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
function RoundEx( X: Double; Precision : Integer ): Double;
{Precision :  1  - до целых,  10  - до десятых,  100  - до сотых...}
var
  ScaledFractPart, Temp : Double;
begin
  ScaledFractPart := Frac(X)*Precision;
  Temp := Frac(ScaledFractPart);
  ScaledFractPart := Int(ScaledFractPart);
  if Temp >=  0 . 5  then ScaledFractPart := ScaledFractPart +  1 ;
  if Temp <= - 0 . 5  then ScaledFractPart := ScaledFractPart -  1 ;
  RoundEx := Int(X) + ScaledFractPart/Precision;
end;
...
Рейтинг: 0 / 0
Округление дробной части числа до двух зеаков
    #32123966
Aleksei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тоже столкнулся с этой проблемой.
Причем плавающая запятая ведет себя на разных машинах по разному!
Пришлось написать свою функцию!
Работает на всех машинах и не ошибается уже 2 года!

Function SummStr(SUMM:String;Razd,ZPT:Boolean):String;Export;
var
S,S1,S2:String;
I,I1,Flag:Integer;
R:Real;
label 1,2;
begin
//Преобр суммы в правильный вид STRING
S:=SUMM;
S1:='';
//Удаление ведущих и ведомых пробелов
For I:=1 To LenGth(S) do
begin
if S <>' ' Then S1:=S1+S;
end;
S:=S1;

S1:='';

//Убераем разделители " ' "
For I:=1 to Length(S) do
begin
if copy(S,I,1)<>'''' Then S1:=S1+S;
end;
S:=S1;S1:='';
//Преобразование запятой в точку
For I:=1 to LenGth(S) do
begin
if S=',' Then S:='.';
end;
//Убираем посторонние знаки
S1:='';
For I:=1 to Length(S) do
begin
if ((S>='0')and(S<='9'))or(S='.') Then S1:=S1+S;
end;
S:=S1;
//Убираем впередистоящие 0
For I:=1 to Length(S) do
begin
if S<>'0' Then goto 1;
S1:=Copy(S,I+1,Length(S));
end;
1: S:=S1;

//---------Добавление нулей--------
//Проверка на наличие запятой (точки)
Flag:=0;
For I:=1 to Length(S) do
begin
if S='.' Then
begin
Flag:=Flag+1;
goto 2;
end;
end;
2:
//Если нет запятой
if Flag=0 Then S:=S+'.00';
//Если есть запятая
If Flag=1 Then
begin
//В случае если после запятой нет знаков
if S[LenGth(S)]='.' Then S:=S+'00';
//В случае если один знак после запятой
if S[LenGth(S)-1]='.' Then S:=S+'0';
//В случае если более двух знаков
if S[LenGth(S)-2]<>'.' Then
begin
//Удаляем погрешность вещественного числа
if S[I+3]='9' Then
begin
//Выделяем копейки
I1:=StrToInt(Copy(S,I+1,2));
//Добавляем недостающею копейку
I1:=I1+1;
//Проверяем на 100
//Выделяем рубли
S:=Copy(S,1,I-1);
S1:=IntToStr(I1);
if LenGth(S1)=1 Then S1:='0'+S1;
if I1=100 Then
begin
S1:='00';
//Преобразовываем в Real
val(S,R,I1);
R:=R+1;
S:=FloatToStr(R);
end;
S:=S+'.'+S1;
end;//9
//Отрезаем лишнее
While S[LenGth(S)-2]<>'.' do S:=Copy(S,1,LenGth(S)-1);
end;
end;
//Проверка на наличие рублей
if S='.' Then S:='0'+S;
//Выполняется если указан разделитель
S2:=S;S1:='';
if Razd=True Then
begin
// S:=Copy(S,1,LenGth(S)-3);
For I:=0 to Length(S) do
begin
S1:=S1+S[Length(S)-I];
end;
S:='';
For I:=1 To Length(S1) do
begin
S:=S+S1;
if ((I=6)or(I=9)or(I=12)or(I=15)or(I=18)or(I=21))and (Length(S1)>I+1) Then S:=S+'''';
end;
S1:='';
For I:=1 To Length(S) do
begin
S1:=S1+S[LenGth(S)-I];
end;
S1:=Copy(S1,1,LenGth(S1)-1);
S:=S1;
end;
//Выполняется если другой разделитель копеек вместо точки
If ZPT=True Then
begin
S:=copy(S,1,length(S)-3)+'-'+copy(S,length(S)-1,2);
if copy(S,length(S)-1,2)='00' then
begin
S:=copy(S,1,length(S)-3)+'=';
end;
end;
//S:=M(S);
Result:=S;
end;

SUMM - Сумма (исходная)
Razd - разделитель разрядов
ZPT - True - выдает 10=
False - выдает 10.00

Только отрицательные числа превращает в положительные, я думаю доработать будет не проблема.

Очень удобно превращать с любого числа в нормальный вид суммы.
...
Рейтинг: 0 / 0
Округление дробной части числа до двух зеаков
    #32123988
Aleksei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот и с отрицательными суммами
Function SummStr(SUMM:String;Razd,ZPT:Boolean):String;Export;
var
S,S1,S2:String;
I,I1,Flag:Integer;
R:Real;
Otr:Boolean;
label 1,2;
begin
//Преобр суммы в правильный вид STRING
S:=SUMM;
S1:='';
Otr:=False;
//Удаление ведущих и ведомых пробелов
For I:=1 To LenGth(S) do
begin
if S <>' ' Then S1:=S1+S;
end;
S:=S1;

S1:='';
//Определаем отрицательность числя
if S>'' Then if S='-' Then Otr:=True;

//Убераем разделители " ' "
For I:=1 to Length(S) do
begin
if copy(S,I,1)<>'''' Then S1:=S1+S;
end;
S:=S1;S1:='';
//Преобразование запятой в точку
For I:=1 to LenGth(S) do
begin
if S=',' Then S:='.';
end;
//Убираем посторонние знаки
S1:='';
For I:=1 to Length(S) do
begin
if ((S>='0')and(S<='9'))or(S='.') Then S1:=S1+S;
end;
S:=S1;
//Убираем впередистоящие 0
For I:=1 to Length(S) do
begin
if S<>'0' Then goto 1;
S1:=Copy(S,I+1,Length(S));
end;
1: S:=S1;

//---------Добавление нулей--------
//Проверка на наличие запятой (точки)
Flag:=0;
For I:=1 to Length(S) do
begin
if S='.' Then
begin
Flag:=Flag+1;
goto 2;
end;
end;
2:
//Если нет запятой
if Flag=0 Then S:=S+'.00';
//Если есть запятая
If Flag=1 Then
begin
//В случае если после запятой нет знаков
if S[LenGth(S)]='.' Then S:=S+'00';
//В случае если один знак после запятой
if S[LenGth(S)-1]='.' Then S:=S+'0';
//В случае если более двух знаков
if S[LenGth(S)-2]<>'.' Then
begin
//Удаляем погрешность вещественного числа
if S[I+3]='9' Then
begin
//Выделяем копейки
I1:=StrToInt(Copy(S,I+1,2));
//Добавляем недостающею копейку
I1:=I1+1;
//Проверяем на 100
//Выделяем рубли
S:=Copy(S,1,I-1);
S1:=IntToStr(I1);
if LenGth(S1)=1 Then S1:='0'+S1;
if I1=100 Then
begin
S1:='00';
//Преобразовываем в Real
val(S,R,I1);
R:=R+1;
S:=FloatToStr(R);
end;
S:=S+'.'+S1;
end;//9
//Отрезаем лишнее
While S[LenGth(S)-2]<>'.' do S:=Copy(S,1,LenGth(S)-1);
end;
end;
//Проверка на наличие рублей
if S='.' Then S:='0'+S;
//Выполняется если указан разделитель
S2:=S;S1:='';
if Razd=True Then
begin
// S:=Copy(S,1,LenGth(S)-3);
For I:=0 to Length(S) do
begin
S1:=S1+S[Length(S)-I];
end;
S:='';
For I:=1 To Length(S1) do
begin
S:=S+S1;
if ((I=6)or(I=9)or(I=12)or(I=15)or(I=18)or(I=21))and (Length(S1)>I+1) Then S:=S+'''';
end;
S1:='';
For I:=1 To Length(S) do
begin
S1:=S1+S[LenGth(S)-I];
end;
S1:=Copy(S1,1,LenGth(S1)-1);
S:=S1;
end;
//Выполняется если другой разделитель копеек вместо точки
If ZPT=True Then
begin
S:=copy(S,1,length(S)-3)+'-'+copy(S,length(S)-1,2);
if copy(S,length(S)-1,2)='00' then
begin
S:=copy(S,1,length(S)-3)+'=';
end;
end;
//S:=M(S);
if otr Then S:='-'+S;
Result:=S;
end;


Ну а, что касается округления где 5 то насчет этого я думаю:
1) У плавающей запятой при проведении каких-либо математических
операциях проблем до такой степени я не встречал
2)Если какой-то чайник вводит сумму с 3-мя знаками после запятой, то
округлять на копейку больше я думаю нет необходимости (пускай сначала
выучит сколько копеек в рубле)
...
Рейтинг: 0 / 0
Округление дробной части числа до двух зеаков
    #32124078
Seryoga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
@ Shark : ыыыы... а причем тут (+) ???
@ Gold : так какая функция? есть она или нет на самом деле?
@ Teo : вот и я о том же.
...
Рейтинг: 0 / 0
Округление дробной части числа до двух зеаков
    #32124227
MONITOR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
StrToFloat(FormatFloat(36.729,'0.00'))
...
Рейтинг: 0 / 0
Округление дробной части числа до двух зеаков
    #32124984
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SimpleRoundTo
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Округление дробной части числа до двух зеаков
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]