Форум: "Основная";
Текущий архив: 2003.11.27;
Скачать: [xml.tar.bz2];
ВнизКак округлить дробное число с 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;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.011 c