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

Вниз

Как округлить дробное число с 3-х занков до 2-х после запятой?   Найти похожие ветки 

 
Anatoly Podgoretsky ©   (2003-11-17 12:40) [40]

sniknik © (17.11.03 12:21) [38]
На сайте Интела

sniknik © (17.11.03 12:37) [39]
Тут происходит много преобразований, и на каждом возможна ошибка представления.


 
Developerr ©   (2003-11-17 12:57) [41]

Я уже совсем запарился. Снова глюк.
ShowMessage(FloatToStr((Round(1.625*100))/100));
Округляет до 1.62, а надо 1.63. Хотя, если взять 1.615 или 1.635 округляет как положено. Кошмар :-(((((


 
Anatoly Podgoretsky ©   (2003-11-17 13:06) [42]

Округлило правильно, до четного.


 
Developerr ©   (2003-11-17 13:08) [43]

Тупые Америкозы, в паскале все работает тип топ.
просто пишем
a:=1.625;
writeln(a:2:2);

И все рабоает. Неужели нельзя было сделать и Delphi тоже самое???
Может есть все-таки что-то подобное?


 
Anatoly Podgoretsky ©   (2003-11-17 13:13) [44]

Да и 1,615 округлило до 1,61 тоже правильно, поскольку 1,615 невожможно представить, а правильное представление такое 1,61499999999999999

Ты зря не пислушался к моему замечанию Anatoly Podgoretsky © (16.11.03 20:23) [4]

При работе с плавающей запятой надо учитывать, что в отличии от фиксированой запятой, точность не абсолютная, а относительная.


 
Developerr ©   (2003-11-17 13:13) [45]


> Anatoly Podgoretsky

Нафига мне до четного? Мне нужно правильно, а не до четного. Сказать преподавателю матеметики, что если округлить число 1.625 до 2-х знаков после запятой получится 1.62. Он и поставит оценку ту которая стоит в конце числа - 2.


 
Anatoly Podgoretsky ©   (2003-11-17 13:14) [46]

А конечно, враги виноваты :-)


 
Anatoly Podgoretsky ©   (2003-11-17 13:16) [47]

Developerr © (17.11.03 13:13) [45]
Так почему ты тогда пользуешься функцией, которая округляет до четного? Не нравится сделай свою, по своим правилам.
А твое правильно, не более правильно, чем другие методы округления, не будь ежиком.


 
sniknik ©   (2003-11-17 13:24) [48]

Developerr © (17.11.03 13:13) [45]
> Нафига мне до четного?
как математическое включается я уже показывал. попробуй с ним и со свои RoundTo.


 
IgAn ©   (2003-11-17 13:40) [49]

2Developper
Trunc(2958,375 * 100 + 0.5)/100
делает именно то, что тебе нужно.


 
Developerr ©   (2003-11-17 13:44) [50]

Короче, пробовал все. Ничего не работает. Буду думать что-то еще.

> Anatoly Podgoretsky ©


> Да и 1,615 округлило до 1,61 тоже правильно, поскольку 1,615
> невожможно представить, а правильное представление такое
> 1,61499999999999999

Фигня это все. Паскаль и фокс под ДОС считают по человечески, а такая срань как Делфи пургу несет. Не зря задорнов про Америкоз говорит: НУ ТУПЫЕ.


 
Anatoly Podgoretsky ©   (2003-11-17 13:46) [51]

У тебя что ни будь еще есть, кроме тупые?


 
Danilka ©   (2003-11-17 13:48) [52]

[50] Developerr © (17.11.03 13:44)
точно! советую срочно переходить на паскаль и фокс под дос. и при запуске программы обязательная заставка со словами задорнова.


 
Developerr ©   (2003-11-17 13:55) [53]


> IgAn ©

Спасибо. Помогло. Пока глюков не выявил.

> Anatoly Podgoretsky ©

Конечно есть. Ну, об этом не будем.


> Danilka ©

Просто 5 баллов. Мне очень понравилось. Спасибо. А ты не Андрей Данилка, который Верку Сердючку играет?


 
Anatoly Podgoretsky ©   (2003-11-17 14:03) [54]

Ну, ну, не поленись проверить.

D := 1.615;
D1 := Trunc(D * 100 + 0.5)/100;
ShowMessage(FloatToStr(D1));
ShowMessage(FloatToStr(Trunc(1.615 * 100 + 0.5)/100));

У тебя огромная дыра в понимании чисел с плавающей запятой


 
IgAn ©   (2003-11-17 14:17) [55]


> Anatoly Podgoretsky © (17.11.03 14:03) [54]
> Ну, ну, не поленись проверить.


Я не поленился, ты тоже не поленись...


D := 1.615;
d1:=D*100;
d1:=d1+0.5;
d1:=d1/100;
ShowMessage(FloatToStr(D1));
ShowMessage(FloatToStr(Trunc(1.615 * 100 + 0.5)/100));


 
sniknik ©   (2003-11-17 14:19) [56]

Anatoly Podgoretsky © (17.11.03 14:03) [54]
как ни странно работает,

вот так не работает
var d, d1: Real48; //указать явно тип
begin
D := 1.615;
D1 := Trunc(D * 100 + 0.5)/100;
ShowMessage(FloatToStr(D1));
ShowMessage(FloatToStr(Trunc(1.615 * 100 + 0.5)/100));
...

видать тут то ему разрядности и не хватает, а тип реал зависит от директив компилятора и может быть как Real48 так и Double-ом.

> Developerr ©
кстати с Double-ом тоже есть такие числа.. :) можно нарватся.


 
Anatoly Podgoretsky ©   (2003-11-17 14:22) [57]

sniknik © (17.11.03 14:19) [56]
1.61 и 1.62, поскольку тип был не указан, то использовался тип Double, но это не принципиально, поскольку меняется точность


 
Developerr ©   (2003-11-17 15:21) [58]


> Anatoly Podgoretsky ©
> Ну, ну, не поленись проверить.
>
> D := 1.615;
> D1 := Trunc(D * 100 + 0.5)/100;
> ShowMessage(FloatToStr(D1));
> ShowMessage(FloatToStr(Trunc(1.615 * 100 + 0.5)/100));
> У тебя огромная дыра в понимании чисел с плавающей запятой

Не поленился! И вчем прикол? Показывает 2 одинаковых сообщения с текстом 1.62.
В чем проблема???


 
BlackTiger ©   (2003-11-17 15:32) [59]

Попробую вспомнить свою функцию... кажется было так:

function ValidRoundTo(D : double; UpTo : double) : double;
var
n, r : double;
begin
n := Trunc(D / UpTo); //извлекаем целую часть
r := Trunc((D - n) * 10); //получаем остаток
if r >= 5 then n := n + 1; // если остаток 5 то накручиваем еще единицу
Result := r * UpTo; //приводим число "обратно"
end;


используется так:

r := ValidRoundUp(345.3145, 0.01); //до 2х знаков {r = 345.31}
r := ValidRoundUp(345.3145, 0.001); //до 3х знаков {r = 345.315}
r := ValidRoundUp(345.3145, 100); //до сотен {r = 300}



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

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

Наверх




Память: 0.58 MB
Время: 0.02 c
1-89836
DimaK
2003-11-16 17:45
2003.11.27
ProgressBar


4-90170
NailMan
2003-10-01 12:19
2003.11.27
Типа передача данных первой копии программы от второй


6-90038
Sesh
2003-09-30 22:02
2003.11.27
Delphi+Internet


1-89869
Ламер
2003-11-16 01:56
2003.11.27
Тэг кнопки


8-90002
S.A.S.
2003-07-31 17:43
2003.11.27
SkinEngine