Округление чисел

  • 10
  • Недоступна
Считать с консоли 2 имени файла. Первый файл содержит вещественные(дробные) числа, разделенные пробелом. Например, 3.1415. Округлить числа до целых и записать через пробел во второй файл. Закрыть потоки. Принцип округления: 3.49 => 3 3.50 => 4 3.51 => 4 -3.49 => -3 -3.50 => -3 -3.51 => -4
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (154)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Ilya Ivanov19 уровень, Казань
суббота, 21:30
Все меньше и меньше людей решают задачи
Dmitry20 уровень
14 августа, 04:52
валидатор для данной задачи неправильно работает! принимает решение, когда в итоговый файл выводится 3 4 4 -3 -4 -4 (т.е. -3.50 округляется до - 4, а не до -3 как написано в условии!!!). И всё бы ничего, если бы не было потрачено на решение 3 часа! Зато со сканером научился работать
Rustam20 уровень, Казань
10 августа, 17:34
Сразу писать числа в файл не получиться, нужно сначала сформировать строку, а затем
"последовательность чисел".getBytes()
писать в файл.
Yerzhan20 уровень
3 августа, 19:53
Долгое время не мог решить задачу, пришлось зайти в комменты и все равно никак не мог записать данные в файл. Обычно я решаю в IJ, не в проекте JavaRush, а после переношу в проект JavaRush и проверяю. После двух дней мучений решил черт с ним перенесу в проект и попрошу помощи у ребят. Пустил на проверку а валидатор засчитал мне только первые два требования, а последующие два не принимал, хотя я на 100% был уверен, что должен принять. Последнее пятое требование тоже не принял. Я читаю: потоки должны быть закрыты. Как только я закрыл поток на запись writer.close(), данные сразу же появились во втором файле. Не забывайте закрывать потоки!
Yerzhan20 уровень
3 августа, 19:54
да, как только закрыл потоки остальные требования тоже были приняты
14 июля, 11:28
Не знаю почему некоторые как будто избегают Math.rounds, хотя он тут идеально подходит. Сделал так: считал из файла дробные числа в одну строку, дальше через split(" ") разбил по кускам. И каждый кусок округлил и записал в строку, которая потом ушла в файл целых чисел.
...
Nordis24 уровень, Санкт-Петербург
18 июля, 19:45
Спасибо ,метод split очень помог. Без него было тяжковато. Да ещё вначале затупил , думал что в первом файле числа в отдельных строках. Потом уже прочитал , что они через пробел там. Вот лошара :). Задачка у меня эта пошла со скрипом , раза 3 переписывал код полностью.
Тимур18 уровень, Москва
23 июля, 18:29
тоже кайфанул от метода split("\\s") задача быстро решилась Кто подскажет, а как закрывать поток, если не создавал переменную? как например закрыть для такой формулировки:
String chisla = new BufferedReader(new FileReader(new Scanner(System.in).nextLine())).readLine();
Pavlo Plynko40 уровень, Киев
30 июля, 09:43
Не делать так, создавать переменную.
Ivan25 уровень, Нижний Новгород
9 июля, 09:48
Может кто нибудь подсказать. Делал округление старыми добрыми if-else, валидатор не принимал, но значения получал такие же как в примере. Сравнивал по такому принципу
if ( number - (int)number>=0.5 )
В итоге всё снёс и сделал через Math.round(). Валидатор принял. Так вот вопрос, при моём сравнении выскакивают косяки с потерей точности, а в Math это учтено?
Константин22 уровень, Москва
28 июня, 13:21
Валидатор принимает вариант без откусывания из строки первого символа начала файла. Файлы у меня сохранялись в UTF-8 и поэтому впереди был символ "\uFEFF", который я успешно выкусывал из строки s = s.substring(1), в файлах всё прекрасно работало, а валидатор не пускал. Ругался на 3 и 4 пункт. А вот если файл в ANSI, то этого символа впереди файла нет!!! (т.е. я выкусывал лишний символ). Именно этот вариант и требует валидатор. Без выкусывания. Поэтому для универсальности нужна проверка:
if( s.startsWith("\uFFFE") || s.startsWith("\uFEFF") ) {
            s = s.substring(1);
        }
Dmitry Potamoshnev30 уровень, Москва
25 июня, 13:48
Психанул... Так не работает с отрицательными:
BigDecimal(numbersOfLine[i]).setScale(0, RoundingMode.HALF_UP)
таким образом "-3.5" округляется в "-4". Где-то прочёл, что BigDecimal используется для всякого рода экономических расчетов. Видимо так же как в экономике логика не всегда прослеживается, в этом объекте она такая же. В итоге буду делать так как написал skybright ниже, а именно:
/* несмотря на то, что странно округлять -3,50 до -3,
метод Math.round(floats[i]) делает ИМЕННО ТАК, без танцев с бубнами. */
Константин22 уровень, Москва
28 июня, 08:05
Также решил через BigDecimal. Для положительных и нуля HALF_UP, для отрицательных чисел использовал HALF_DOWN и тогда всё верно работает согласно заданию -3,50 => -3 Но, валидатор не пускает это решение. (Хотя может из-за того что сделал решение для многострочного файла.) Спасибо за Math.round(floats[i]), от которого первоначально отказался, думая что так нелогично округлять этот метод не будет.
Андрей Зуйков20 уровень, Санкт-Петербург
20 июня, 20:15
Если у кого то будет вылетать NumberFormatException при использованние BufferedReader, то посмотрите на первые символы считанной строки... Сохранил текстовый файл в кодировке ANSI и все прошло.
Nubas19 уровень, Новосибирск
17 июня, 21:08
- Scanner сразу выдаст вам строку со всеми символами - Math.round отлично справляется с округлением по указанным в задании правилам - используйте стандартный метод .split(" ") для типа String, он сразу возвращает массив символов